@Alpacadh
2019-02-23T16:23:19.000000Z
字数 3644
阅读 667
dp
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string.h>
#include<stdio.h>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=250+5;
const double eps=1e-4;
typedef long long ll;
typedef pair<int,ll> pil;
int dp[N][N];
int t[N];
bool h[2*N][N][2];
int main()
{
int n;
int tot=1;
while(~scanf("%d",&n))
{
if(n==0)
break;
int T;
memset(h,0,sizeof(h));
memset(t,0,sizeof(t));
memset(dp,0,sizeof(dp));
scanf("%d",&T);
for(int i=1;i<n;i++)
dp[T][i]=inf;
dp[T][n]=0;
for(int i=1;i<n;i++)
scanf("%d",&t[i]);
int tep,m1,m2;
scanf("%d",&m1);
for(int i=1;i<=m1;i++)
{
scanf("%d",&tep);
for(int j=1;j<=n;j++)
{
h[tep][j][0]=1;
tep+=t[j];
}
}
scanf("%d",&m2);
for(int i=1;i<=m2;i++)
{
scanf("%d",&tep);
for(int j=n;j>=1;j--)
{
h[tep][j][1]=1;
tep+=t[j-1];
}
}
for(int i=T-1;i>=0;i--)
{
for(int j=1;j<=n;j++)
{
dp[i][j]=dp[i+1][j]+1;
if(j<n&&i+t[j]<=T&&h[i][j][0])
dp[i][j]=min(dp[i][j],dp[i+t[j]][j+1]);
if(j>1&&i+t[j-1]<=T&&h[i][j][1])
dp[i][j]=min(dp[i][j],dp[i+t[j-1]][j-1]);
}
}
printf("Case Number %d: ",tot++);
if(dp[0][1]>=inf)
printf("impossible\n");
else
printf("%d\n",dp[0][1]);
}
return 0;
}
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string.h>
#include<stdio.h>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=250+5;
const double eps=1e-4;
typedef long long ll;
typedef pair<int,ll> pil;
int dp[N];
struct po
{
int x,y,z;
}p[N];
bool cmp(po a,po b)
{
return a.x*b.y<b.x*b.y;
}
int cnt;
void add(int x,int y,int z)
{
p[cnt].x=x;
p[cnt].y=y;
p[cnt++].z=z;
p[cnt].x=x;
p[cnt].y=z;
p[cnt++].z=y;
p[cnt].x=y;
p[cnt].y=x;
p[cnt++].z=z;
p[cnt].x=y;
p[cnt].y=z;
p[cnt++].z=x;
p[cnt].x=z;
p[cnt].y=x;
p[cnt++].z=y;
p[cnt].x=z;
p[cnt].y=y;
p[cnt++].z=x;
}
int main()
{
int tot=1;
int n;
while(scanf("%d",&n))
{
if(n==0)
break;
cnt=0;
for(int i=0;i<n;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
sort(p,p+cnt,cmp);
memset(dp,0,sizeof(dp));
int ma=-inf;
for(int i=0;i<cnt;i++)
{
dp[i]=p[i].z;
for(int j=0;j<i;j++)
{
if(p[i].x>p[j].x&&p[i].y>p[j].y)
dp[i]=max(dp[i],dp[j]+p[i].z);
}
ma=max(ma,dp[i]);
}
printf("Case %d: maximum height = %d\n",tot++,ma);
}
return 0;
}
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string.h>
#include<stdio.h>
#include<cstdlib>
#include<cstdio>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=200+5;
const double eps=1e-4;
typedef long long ll;
typedef pair<int,ll> pil;
int dp[N][N];
int a[N][N];
int path[N][N];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m))
{
int ans=inf;
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
memset(dp,inf,sizeof(dp));
for(int i=1;i<=n;i++)
dp[i][m]=a[i][m];
for(int i=m;i>=2;i--)
{
for(int j=1;j<=n;j++)
{
int rows[3]={j-1,j,j+1};
if(j==1)
rows[0]=n;
else if(j==n)
rows[2]=1;
sort(rows,rows+3);
for(int k=0;k<3;k++)
{
int temp=dp[j][i]+a[rows[k]][i-1];
if(temp<dp[rows[k]][i-1])
{
dp[rows[k]][i-1]=temp;
path[rows[k]][i-1]=j;
}
}
}
}
int cnt;
for(int i=1;i<=n;i++)
{
if(dp[i][1]<ans)
ans=dp[i][1],cnt=i;
}
printf("%d",cnt);
for(int j=1,i=path[cnt][j];j<m;j++,i=path[i][j])
printf(" %d",i);
printf("\n");
printf("%d\n",ans);
}
return 0;
}