uva 116 动态规划-单向TSP(输出结果字典序)
来源:互联网 发布:爬虫部署到阿里云 编辑:程序博客网 时间:2024/05/17 07:40
1、
2、题目大意:
给定一个m × n的整数矩阵,你要写一个程序来计算出最小权值。一条路径从列1(第一列)的任意位置开始,包括一系列的移动,最终抵达列n(最后一列)。每一步均由列i到列i+1的相邻行(水平或对角)。 矩阵的第一行和最后一行(行1和m)认为是相邻的,也就是说矩阵是环绕的,就像一个水平的圆柱体。合法的移动图示如下。
The weight of a path is the sum of the integers in each of the n cells of the matrix that are visited.
路径的权重就是矩阵中遍例到的所有n个单元的整数值之和。
For example, two slightly different 5 × 6 matrices are shown below (the only difference is the numbers in the bottom row).
比如,两个稍有不同的5 × 6的矩阵图示如下(仅仅在最下一行的数字中有一处不同)。
The minimal path is illustrated for each matrix. Note that the path for the matrix on the right takes advantage of the adjacency property of the first and last rows.
两个矩阵的最短路径如图所示。注意右边矩阵的最短路径利用了最上一行和最下一行的特殊相邻性质。
3、状态很容易得到,可以到达三个状态,右上,右边,右下
4、AC代码:不知道为什么必须倒着进行,
#include<stdio.h>#include<algorithm>using namespace std;#define N 0x7fffffffint dp[100][10];int prev[100][10];int n,m;int map[100][10];void DP(){ for(int j=m-2;j>=0;j--) { for(int i=0;i<n;i++) { int minx=(i-1+n)%n; if(map[j+1][minx]>map[j+1][i]) { minx=i; } else if(map[j+1][minx]==map[j+1][i]) minx=min(minx,i); if(map[j+1][minx]>map[j+1][(i+1+n)%n]) minx=(i+1+n)%n; else if(map[j+1][minx]==map[j+1][(i+1+n)%n]) minx=min(minx,(i+1+n)%n); map[j][i]+=map[j+1][minx]; prev[j][i]=minx; } }}int main(){ while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) scanf("%d",&map[j][i]); } DP(); int minn=N,mx; for(int i=0;i<n;i++) { if(map[0][i]<minn) { minn=map[0][i]; mx=i; } } printf("%d",mx+1); int mxx=mx; for(int j=1;j<m;j++) { int i=mx; printf(" %d",prev[j-1][i]+1); mx=prev[j-1][i]; } printf("\n"); printf("%d\n",map[0][mxx]); } return 0;}
4.代码不正确,待改正:
#include<stdio.h>#include<algorithm>using namespace std;#define N 0x7fffffffint dp[10][100];int prev[10][100];int n,m;int map[10][100];void DP(){ for(int j=m-2;j>=0;j--) { for(int i=0;i<n;i++) { int minx=(i-1+n)%n; if(map[minx][j+1]>map[i][j+1]) { minx=i; } else if(map[minx][j+1]==map[i][j+1]) minx=min(minx,i); if(map[minx][j+1]>map[(i+1+n)%n][j+1]) minx=(i+1+n)%n; else if(map[minx][j+1]==map[(i+1+n)%n][j+1]) minx=min(minx,(i+1+n)%n); map[i][j]+=map[minx][j+1]; prev[i][j]=minx; } }}int main(){ while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<n;i++) { for(int j=0;j<m;j++) scanf("%d",&map[i][j]); } DP(); int minn=N,mx; for(int i=0;i<n;i++) { if(map[i][0]<minn) { minn=map[i][0]; mx=i; } } printf("%d",mx+1); for(int j=1;j<m;j++) { int i=mx; printf(" %d",prev[i][j-1]+1); mx=prev[i][j-1]; } printf("\n"); printf("%d\n",map[mx][0]); } return 0;}
- uva 116 动态规划-单向TSP(输出结果字典序)
- uva 116 Unidirectional TSP 单向TSP 问题,经典dP(路径输出注意规划方向)
- 动态规划--多段图的最短路--单向TSp(Unidirectional TSP ,UVa 116)
- UVA - 116 - Unidirectional TSP(动态规划)
- 动态规划(Unidirectional TSP,uva 116)
- UVA 116 Unidirectional TSP(动态规划)
- UVa 116 - Unidirectional TSP(单向TSP)
- 单向TSP(unidirectional TSP,UVa 116)
- UVa116 单向TSP 动态规划
- uva 116 单向tsp
- uva 116 单向TSP
- UVA 116(单向TSP)
- 【uva】116-Unidirectional TSP(动态规划,路径问题)
- uva 116 - Unidirectional TSP (动态规划)
- UVA 116 Unidirectional TSP单向TSP(DP)
- 例题9-4 单向TSP(Unidirectional TSP, UVa 116)
- UVA 116 单向TSP DP
- uva 116 Unidirectional (单向)TSP
- pdf文档解析的研究
- 安静的力量:内向者的静争力
- 生成不重复随机数
- java volatile应用之 AtomicInteger
- stringByReplacingCharactersInRange: withString: 實現字符串删除,替换
- uva 116 动态规划-单向TSP(输出结果字典序)
- URAL 1037. Memory Management (模拟)
- Linux内核网络协议栈8—socket监听
- VB.net 临时表实现限制用户重复登录
- location.hash详解
- 玩转robots协议
- Windows 系统磁盘克隆
- timus 1207. Median on the Plane URAL 解题报告 计算几何 求两点把点均分
- OpenStack基于Libvirt的虚拟化平台调度实现----Nova虚拟机启动源码实现(1)