紫书上的例题,自己实现了一遍,供参考。
参考代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int inf = 0x3f3f3f3f;
int mp[15][105];
int dp[15][105]; //表示以某个单元出发,到达最后一列经过的整数之和最小值
int n,m;
void Print(int i,int j){
if(j>=m) return;
if(j==0) printf("%d",i+1);
else printf(" %d",i+1);
int temp[]={i,(i-1+n)%n,(i+1)%n};
sort(temp,temp+3);
int r=temp[0];
if(dp[r][j+1]>dp[temp[1]][j+1]) r=temp[1];
if(dp[r][j+1]>dp[temp[2]][j+1]) r=temp[2];
Print(r,j+1);
}
int main(){
while(cin >> n >> m){
memset(mp,inf,sizeof(mp));
memset(dp,inf,sizeof(dp));
for(int i=0; i<n; i++)
for(int j=0; j<m; j++)
cin >> mp[i][j];
for(int i=0; i<n; i++) dp[i][m-1]=mp[i][m-1];
for(int j=m-2; j>=0; j--)
for(int i=0; i<n; i++)
dp[i][j]=min(dp[(i-1+n)%n][j+1],min(dp[(i+1)%n][j+1],dp[i][j+1]))+mp[i][j];
int Min=inf,ind=m;
for(int i=0; i<n; i++){
if(Min>dp[i][0]){
Min = dp[i][0];
ind = i;
}
}
Print(ind,0);
printf("\n%d\n",dp[ind][0]);
}
return 0;
}