您的位置:首页 > 其它

uva 116 - Unidirectional TSP

2013-08-10 19:06 330 查看
简单的动规 就是枚举起点(第一列) 然后找出最小值 英语是硬伤 最小字典序这个问题竟然没注意到 状态转移方程dp[i][j]=min(dp[i+1][j+1],dp[i][j+1],dp[i-1][j+1]);

路径用个二维数组记录下就可以了!

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>

int vis[110][110];
int dp[110][110];
int a[110][110];
int move[3]={-1,0,1};
int n,m;
int dfs(int x, int y)
{
if(y==m)
return dp[x][y]=0;
if(dp[x][y]!=-1)
return dp[x][y];
dp[x][y]=dfs(x, y+1)+a[x][y];
vis[x][y]=x;
for(int i=-1; i<2; i++)
{
int nx=x+i;
if(nx==-1)
nx=n-1;
else if(nx==n)
nx=0;
int temp=dfs(nx, y+1)+a[x][y];
if(temp<dp[x][y])
{
dp[x][y]=temp;
vis[x][y]=nx;
}
else if(temp==dp[x][y] && nx<vis[x][y])
{
dp[x][y]=temp;
vis[x][y]=nx;
}
}
return dp[x][y];
}
int main()
{
//freopen("s.txt","r",stdin);
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 ans=0x7fffffff;
int x;
memset(vis, 0, sizeof(vis));
memset(dp, -1, sizeof(dp));
for(int i=0; i<n; i++)
{
if(dfs(i,0)<ans)
{
ans=dp[i][0];
x=i;
}
}
printf("%d",x+1);
for(int i=0; i<m-1; i++)
printf(" %d",vis[x][i]+1),x=vis[x][i];
puts("");
printf("%d\n",ans);
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: