poj 2353 DP 求从一个矩形第1层走到最后一层的最小花费

来源:互联网 发布:淘宝 御品电动尾门 编辑:程序博客网 时间:2024/06/07 07:25
#include<cstdio>#include<cstring>#define INF 0x3f3f3f3fstruct{int x,y;}step[510][510];int dp[510][510];int d[510][510];int put[10000];int main(){int m,n;scanf("%d%d",&m,&n);for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)scanf("%d",&d[i][j]);for(int j=1;j<=n;j++){    dp[1][j]=d[1][j];    step[1][j].x=j;    step[1][j].y=0;}for(int i=2;i<=m;i++){    for(int j=1;j<=n;j++){dp[i][j]=dp[i-1][j]+d[i][j];step[i][j].x=j;step[i][j].y=i-1;}for(int j=2;j<=n;j++){if(dp[i][j]>dp[i][j-1]+d[i][j]){dp[i][j]=dp[i][j-1]+d[i][j];step[i][j].x=j-1;step[i][j].y=i;}}for(int j=n-1;j>=1;j--){if(dp[i][j]>dp[i][j+1]+d[i][j]){dp[i][j]=dp[i][j+1]+d[i][j];step[i][j].x=j+1;step[i][j].y=i;}}}int res=INF,lo;for(int j=1;j<=n;j++)    if(res>dp[m][j]){res=dp[m][j];lo=j;} int tot=1;put[tot]=lo;while(step[m][lo].y!=0){put[++tot]=step[m][lo].x;if(step[m][lo].y==m)lo=step[m][lo].x; elsem--;} for(int i=tot;i>=1;i--)printf("%d\n",put[i]);return 0;}

0 0
原创粉丝点击