博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
例题9-4 UVa116 Unidirectional TSP(DP:多段图的最短路)
阅读量:6082 次
发布时间:2019-06-20

本文共 1296 字,大约阅读时间需要 4 分钟。

题意:

看白书

要点:

一共三种决策:直行,右上,右下。那么就递推,注意题目中可以从第一列的任意一行出发,而且是环形的,最后还得按字典序输出路径,路径输出就直接用数组记录,因为是倒序递推,所以正序直接可以得到路径。

#include
#include
#include
#include
using namespace std;const int inf = 0x3f3f3f3f;int n, m;int a[30][300], d[30][300];int nex[30][300];void dp(){ int ans = inf, first = 0; for (int j = n - 1; j >= 0; j--) { for (int i = 0; i < m; i++) { if (j == n - 1) d[i][j] = a[i][j]; else { int row[3] = { i,i - 1,i + 1 }; if (i == 0) row[1] = m - 1; if (i == m - 1) row[2] = 0; sort(row, row + 3);//先排序可以确保优先选择字典序小的行 d[i][j] = inf; for (int k = 0; k<3; k++)//这里求三种决策的最优解 { int v = d[row[k]][j+1] + a[i][j]; if (d[i][j]>v) { d[i][j] = v; nex[i][j] = row[k];//路径记录,因为是逆序的,所以反向就直接是正序 } } } if (j == 0 && ans > d[i][j])//这里求从第一列的哪一行出发的最优解 { ans = d[i][j]; first = i; } } } printf("%d", first + 1); int i = nex[first][0]; for (int j = 1; j < n; j++)//正序输出的就是路径 { printf(" %d", i + 1); i = nex[i][j]; } printf("\n%d\n", ans);}int main(){ while (scanf("%d%d", &m, &n) != EOF)//注意行列输入对应的m和n { for (int i = 0; i < m; i++) for (int j = 0; j < n; j++) scanf("%d", &a[i][j]); dp(); } return 0;}

转载于:https://www.cnblogs.com/seasonal/p/10343742.html

你可能感兴趣的文章
linux环境配置
查看>>
ASP.NET MVC中从前台页面视图(View)传递数据到后台控制器(Controller)方式
查看>>
一个想法(续二):换个角度思考如何解决IT企业招聘难的问题!
查看>>
tomcat指定配置文件路径方法
查看>>
linux下查看各硬件型号
查看>>
epoll的lt和et模式的实验
查看>>
Flux OOM实例
查看>>
07-k8s-dns
查看>>
Android 中 ListView 分页加载数据
查看>>
oracle启动报错:ORA-00845: MEMORY_TARGET not supported on this system
查看>>
Go方法
查看>>
Dapper丶DapperExtention,以及AbpDapper之间的关系,
查看>>
搞IT的同学们,你们在哪个等级__那些年发过的帖子
查看>>
且谈语音搜索
查看>>
MySQL数据库导入导出常用命令
查看>>
低版本Samba无法挂载
查看>>
Telegraf+Influxdb+Grafana构建监控平台
查看>>
使用excel 展现数据库内容
查看>>
C#方法拓展
查看>>
MySql.Data.dll的版本
查看>>