您的位置:首页 > 其它

UVA 116 Unidirectional TSP(dp)

2017-02-27 12:59 393 查看
分析:本题中每一列就是一个阶段,每个阶段有三种决策;状态方程dp[i][j]=min(dp[i-1][j+1],dp[i][j+1],dp[i+1][j+1]);dp(i,j)表示当前阶段到最后一列的最小消耗。

路径记录:用next1[][]来保存下一列行号。

AC代码:

#include<cstdio>
#include<algorithm>
#define INF 2147483647
using namespace std;
int dp[12][102];
int a[12][102];
int next1[12][102];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)==2){
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
scanf("%d",&a[i][j]);
int T=INF,first=0;
for(int j=m-1;j>=0;j--){
for(int i=0;i<n;i++){
if(j==m-1)dp[i][j]=a[i][j];
else {
int rows[]={i,i-1,i+1};
if(i==0)rows[1]=n-1;
if(i==n-1)rows[2]=0;
sort(rows,rows+3);
dp[i][j]=INF;
for(int k=0;k<3;k++){
int tmp=a[i][j]+dp[rows[k]][j+1];
if(tmp<dp[i][j]){
dp[i][j]=tmp;
next1[i][j]=rows[k];
}
}
}
if(j==0 &&T >dp[i][j]){
T=dp[i][j];
first=i;
}
}
}

printf("%d",first+1);
int i=first;
for(int j=0;j<m-1;j++){
printf(" %d",next1[i][j]+1);
i=next1[i][j];
}
printf("\n%d\n",T);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: