uva 116 Unidirectional TSP
2015-05-29 14:52
260 查看
中午闲来无事编一道水题
,唉,还是好久不编了,好多变量名写混,结果一直调试不对。这道题目属于多阶段决策问题,题目是求多段图的最短路,还是动态规划,比较简单,用dp [i][j]表示从第i行j列这个点到最后一列的最短距离,然后从最后一列向前递推,每次找到相对优的策略时应保存当前决策便于打印路径,最后递推到第一列时,注意保存下开始位置和最短距离。(还是要细心再细心呀!)
,唉,还是好久不编了,好多变量名写混,结果一直调试不对。这道题目属于多阶段决策问题,题目是求多段图的最短路,还是动态规划,比较简单,用dp [i][j]表示从第i行j列这个点到最后一列的最短距离,然后从最后一列向前递推,每次找到相对优的策略时应保存当前决策便于打印路径,最后递推到第一列时,注意保存下开始位置和最短距离。(还是要细心再细心呀!)
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define INF 1000000 using namespace std; int main() { // freopen("input.txt","r",stdin); int n,m,i,j,a[102][102],dp[102][102],d[102][102],ans,first; while(scanf("%d%d",&n,&m)!=EOF){ ans=INF; for(i=1;i<=n;i++) { for(j=1;j<=m;j++) { scanf("%d",&a[i][j]); } } for(j=m;j>=1;j--) { for(i=1;i<=n;i++) { dp[i][j]=INF; if(j==m){ dp[i][j]=a[i][j]; } else{ int rows[]={i-1,i,i+1}; if(i==1) rows[0]=n; if(i==n) rows[2]=1; sort(rows,rows+3); for(int k=0;k<3;k++) { if(dp[rows[k]][j+1]+a[i][j]<dp[i][j]){ dp[i][j]=dp[rows[k]][j+1]+a[i][j]; d[i][j]=rows[k]; } } } if(j==1){ if(dp[i][j]<ans){ ans=dp[i][j]; first=i; } } } } printf("%d",first); for(i=first,j=1;j<m;j++) { i=d[i][j]; printf(" %d",i); } printf("\n%d\n",ans); } return 0; }
相关文章推荐
- C++动态规划之最长公子序列实例
- C++动态规划之背包问题解决方法
- C#使用动态规划解决0-1背包问题实例分析
- C++ 动态规划
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography