- 晴天小猪历险记之Hill
- 2014-11-02 08:24:07 @
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
int n,a[1005][1005];
int dp[1005][1005];
int min4(int a,int b,int c,int d)
{
int mi=1e8;
if(a<mi) mi=a;
if(b<mi) mi=b;
if(c<mi) mi=c;
if(d<mi) mi=d;
return mi;
}
int min3(int a,int b,int c)
{
int mi=1e8;
if(a<mi) mi=a;
if(b<mi) mi=b;
if(c<mi) mi=c;
return mi;
}
int min2(int a,int b)
{
int mi=1e8;
if(a<mi) mi=a;
if(b<mi) mi=b;
return mi;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
scanf("%d",&a[i][j]);
for(int i=0;i<=n+1;i++)
for(int j=0;j<=i+1;j++)
dp[i][j]=1e9;
dp[1][1]=a[1][1];
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(j==1) dp[i][j]=min2(dp[i-1][i-1],dp[i-1][j])+a[i][j];
else if(j==i) dp[i][j]=min4(dp[i-1][i-1],dp[i-1][1],dp[i][j-1],dp[i][1])+a[i][j];
else dp[i][j]=min3(dp[i-1][j-1],dp[i-1][j],dp[i][j-1])+a[i][j];
}
for(int j=i;j>=1;j--)
{
if(j==1) dp[i][j]=min3(dp[i][j],dp[i][i]+a[i][j],dp[i][j+1]+a[i][j]);
if(j>1&&j<i) dp[i][j]=min2(dp[i][j],dp[i][j+1]+a[i][j]);
}
}
/*for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
printf("%d ",dp[i][j]);
printf("\n");
}*/
printf("%d\n",dp[n][1]);
return 0;
}
2 条评论
-
汤海洋 LV 6 @ 2016-10-07 13:58:35
好长啊
-
2014-11-02 08:36:09@
这题能倒着做吗?
- 1