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]);
路径用个二维数组记录下就可以了!
View Code
路径用个二维数组记录下就可以了!
#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
相关文章推荐
- uva 116 Unidirectional TSP dp + 打印路径
- Uva 116 - Unidirectional TSP
- uva116 unidirectional TSP
- Uva - 116 - Unidirectional TSP
- UVa116 - Unidirectional TSP
- UVa 116 - Unidirectional TSP
- UVA 116 Unidirectional TSP
- UVA 116 Unidirectional TSP
- UVa 116 - Unidirectional TSP
- UVa - 116 - Unidirectional TSP
- UVA - 116 Unidirectional TSP
- 例题9-4 单向TSP(Unidirectional TSP, UVa 116)
- Uva116 Unidirectional TSP
- UVa 116 - Unidirectional TSP
- 动态规划--多段图的最短路--单向TSp(Unidirectional TSP ,UVa 116)
- uva 116 Unidirectional TSP
- UVa - 116 - Unidirectional TSP
- UVA-116 - Unidirectional TSP
- uva 116 Unidirectional TSP
- UVa 116 Unidirectional TSP