http://acm.hust.edu.cn:8080/judge/problem/viewProblem.action?id=18206  1 /*
  2 题目大意:
  3 从第一列的任意一格出发,到子最后一列的任意一格,的最短路。(一开是理解错了,以为是到第n行m列那个格子,知道样例没过,才发现)
  4 每一格只能这样走  5
  6
  7
  8 而且第一行向上可以走到最后一行,
  9 最后一行向下是第一行
 10 */
 11 dp[i][j]存储 第[i][j]到一列的最短路
 12 状态转移方程为:
 13 dp[i][j]=min(dp[i-1][j+1],dp[i][j+1],dp[i+1][j+1]);
 14 next[i][j]后继节点
 15 #include<stdio.h>
 16 #define maxn 200
 17 #define inf 0xfffffff
 18 #include<string.h>
 19 int min(int x,int y)
 20 {
 21     if(x<y)return x;
 22     else return y;
 23
 24 }
 25 int n,m,next[maxn][maxn];
 26 int dp[maxn][maxn],map[maxn][maxn];
 27 void init()
 28 {
 29     int i,j;
 30     memset(next,0,sizeof(next));
 31     for(i=0;i<=n;i++)
 32     {
 33
 34         for(j=0;j<=m;j++)
 35           dp[i][j]=inf;
 36     }
 37    for(i=1;i<=n;i++)
 38    {
 39        dp[i][m]=map[i][m];
 40    }
 41 }
 42 int  dfs(int x,int y)
 43 {
 44     int sum,d1,d3;
 45
 46     if(y>m)return inf;
 47     if(dp[x][y]!=inf)return dp[x][y];
 48
 49     int k;
 50     int x1,x2,x3;
 51
 52     if(x-1==0)d1=n;
 53     else d1=x-1;
 54     if(x+1>n)d3=1;
 55     else d3=x+1;
 56
 57     x1=dfs(d1,y+1);
 58     x2=dfs(x,y+1);
 59     x3=dfs(d3,y+1);
 60
 61     if(x1>=inf&&x2>=inf&&x3>=inf){dp[x][y]=inf;return inf;}
 62     else
 63     {
 64         if(x1<x2)
 65         {
 66             sum=x1;
 67             k=d1;
 68         }
 69         else
 70         {
 71             if(x1==x2)
 72             {
 73                k=min(d1,x);
 74                sum=x1;
 75             }
 76             else
 77             {
 78                 k=x;
 79                 sum=x2;
 80             }
 81
 82         }
 83         if(sum>x3)
 84         {
 85             k=d3;
 86             sum=x3;
 87
 88         }
 89         else
 90         {
 91             if(sum==x3)
 92             {
 93                 k=min(k,d3);
 94             }
 95         }
 96         next[x][y]=k;
 97
 98     dp[x][y]=dp[k][y+1]+map[x][y];
 99     return dp[x][y];
100
101     }
102
103
104
105 }
106 int GET()
107 {
108     int k,i,sum=inf;
109     for(i=1;i<=n;i++)
110     {
111         if(dp[i][1]<sum)
112         {
113             k=i;
114             sum=dp[i][1];
115         }
116     }
117     for(i=1;i<=m;i++)
118     {
119         if(i==1)
120         printf("%d",k);
121         else printf(" %d",k);
122         k=next[k][i];
123     }
124     printf("\n%d\n",sum);
125     return 0;
126 }
127 int main()
128 {
129     int i,j;
130     while(scanf("%d%d",&n,&m)!=EOF)
131     {
132
133         for(i=1;i<=n;i++)
134         {
135             for(j=1;j<=m;j++)
136                scanf("%d",&map[i][j]);
137         }
138         init();
139        int ans=inf;
140        for(i=1;i<=n;i++)
141           dfs(i,1);
142
143           /*for(i=1;i<=n;i++)
144           {
145               for(j=1;j<=m;j++)
146            {
147                 printf("%d ",dp[i][j]);
148
149            }
150            printf("\n");
151           }*/
152
153           GET();
154     }
155
156 }

转载于:https://www.cnblogs.com/acSzz/archive/2012/05/27/2519947.html

UVA 116 Unidirectional TSP (白书dp)相关推荐

  1. UVA 116 Unidirectional TSP DP

    题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&p ...

  2. UVA 116——Unidirectional TSP

    题意:给定一个n*m的矩阵,从第一列任意位置向右,右下,右上走一格,可以循环,要求经过的数字的和最小. 思路:记忆化搜索.每次有三个状态,从这三个状态中选择出最优的一个,然后状态累加,保存路径. co ...

  3. Unidirectional TSP UVA - 116(多阶段决策+输出字典序最小的路径)

    Unidirectional TSP UVA - 116 题意: 给你m行n列的矩阵,从第一列出发,到最后一列. 要求 经过的整数和最小. 输出路径上,每列的行号,多解时,输出字典序最小的. 思路: ...

  4. UVa在线比赛单题汇总-----DP专题

    动态规划基础 例题 LA 3882 UVa 3882 - And Then There Was One 递推------------无力orz UVa 10635 10635 - Prince and ...

  5. 白书P61 - 点集配对问题

    白书P61 - 点集配对问题 状压DP #include <iostream> #include <cstdio> #include <cstring> using ...

  6. UVa 116 (多段图的最短路) Unidirectional TSP

    题意: 有一个m行n列的正整数环形矩阵(即矩阵第一行的上一行是最后一行,最后一行的下一行是第一行),从第一列的任意位置出发,每次只能向右,右上,右下三个方向行走,输出路径及路径上所有数之和的最大值,多 ...

  7. 单向TSP问题(Uva 116)

    题意:就是给你一个图 让你从第一列开始走到最后一列 寻找最小的路径,然后这一题难点在于 路径的记录以及第一行跟最后一行联通 最后一行跟第一行也是联通的 题目传送门 代码如下,紫书讲的很好了我就不写分析 ...

  8. Unidirectional TSP—dp

    问题描述: Problems that require minimum paths through some domain appear in many different areas of comp ...

  9. 紫书动规 例题9-13 UVA - 1220 Party at Hali-Bula 树形dp

    题目链接: https://vjudge.net/problem/UVA-1220 题意: 题解: 树形dp: 树的最大独立集问题 d[u][0]:=不选u能得到的最大人数 d[u][0]=sum{m ...

最新文章

  1. Android中有关Handler的总结
  2. 10秒完成Linux系统pip在线安装
  3. 数据库实时转移之Confluent介绍(一)
  4. 广域网智能流量调度—Vecloud
  5. Android 一s个相对完整的自动升级功能实现代码
  6. 进程之间的通信方式-共享内存
  7. 合并数组内的对象的数字
  8. python:就喜欢看你看不惯我又干不掉我的样子
  9. 阿里巴巴开源技术汇总:115个软件(五)
  10. Ubuntu源码安装Nginx
  11. 网线制作实验相关内容
  12. 解决弹出 “百度未授权使用地图API,可能是因为您提供的密钥不是有效的百度LBS开放平台密钥”的方法
  13. springboot+Vue+Elementui医院网上预约挂号系统java项目
  14. iOS开发调试技巧之在App设置中切换服务器环境
  15. 项目管理之如何进行项目干系人管理
  16. 高中日语老师教师资格证考试成功通过前辈备考经验分享
  17. 如何应对 DDoS 勒索攻击?
  18. 用计算机用语说唯美的话,经典说说唯美句子
  19. 2022年第十一届认证杯数学中国数学建模国际赛小美赛:D题野生动物贸易是否应该长期禁止建模 38页一等奖论文及代码
  20. python自动抢票的原理_Python突破12306最后一道防线,实现自动抢票(附源码)

热门文章

  1. Mac下老弹出mackeeper的网页
  2. mendeley 安装Microsoft Word 插件 报错及解决
  3. 纯css3制作写轮眼开眼及进化过程
  4. 抽取JDBC工具类的方法
  5. lasagne embedding layer理解
  6. HTTP报文头解析(图文)
  7. (2011-12-14 旧博文搬运)闪耀十字军(ティンクル☆くるせいだーす)【2】
  8. Codeforces Gym 100286J Javanese Cryptoanalysis 傻逼暴力
  9. 亿级流量、高并发与高性能场景下的电商详情页架构_6(Redis Replication)
  10. PHP 开发 APP 接口 学习笔记与总结 - 静态缓存