hdu5092

来源:互联网 发布:日期提醒软件 编辑:程序博客网 时间:2024/06/02 23:02
#include<iostream>#include<cstdio>using namespace std;#define INF 0xfffffffint s[110][110];int dp[110][110];int path[110][110];int m,n;void print(int i,int j){if(i<0) return;if(path[i][j]==-1){cout<<j+1<<' ';return ;}else{print(i-1,path[i][j]);//递归上一行的行标,列标cout<<j+1; //输出当前列标if(i!=m-1) cout<<' ';}}int main(){int t;cin>>t;int cnt=0;while(t--){cin>>m>>n;for(int i=0;i<m;i++)for(int j=0;j<n;j++){cin>>s[i][j];dp[i][j]=INF;path[i][j]=-1;//记录i-1行的列标}for(int i=0;i<n;i++)dp[0][i]=s[0][i];for(int i=1;i<m;i++)for(int j=0;j<n;j++){if(j<n-1&&dp[i][j]>dp[i-1][j+1]+s[i][j]) //先从最右边的开始dp{dp[i][j]=dp[i-1][j+1]+s[i][j];path[i][j]=j+1;}if(dp[i][j]>dp[i-1][j]+s[i][j]){dp[i][j]=dp[i-1][j]+s[i][j];path[i][j]=j;}if(j>=1&&dp[i][j]>dp[i-1][j-1]+s[i][j]){dp[i][j]=dp[i-1][j-1]+s[i][j];path[i][j]=j-1;}}int ans=INF,ansj;for(int j=0;j<n;j++){if(dp[m-1][j]<=ans){ans=dp[m-1][j];ansj=j;}}printf("Case %d\n",++cnt);print(m-1,ansj);cout<<endl;}}

0 0
原创粉丝点击