题意:

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

分析:

这道题有点像数塔的变形,不同的是从三角形变成了矩形。依然是从最后一列往前递推。Next数组时用来记录路径的,first是最优解的第一列的行号。代码中将下一行的三个拓展出的行号排序来保证字典序最小。

 1 #include <cstdio>
 2 #include <algorithm>
 3
 4 const int maxm = 15;
 5 const int maxn = 100 + 5;
 6 const int INF = 1000000000;
 7 int m, n, d[maxm][maxn], a[maxm][maxn], next[maxm][maxn];
 8
 9 int main(void)
10 {
11     //freopen("116in.txt", "r", stdin);
12     while(scanf("%d%d", &m, &n) == 2)
13     {
14         int ans = INF, first = 0;
15         for(int i = 0; i < m; ++i)
16             for(int j = 0; j < n; ++j)
17                 scanf("%d", &a[i][j]);
18         for(int j = n-1; j >= 0; --j)
19         {
20             for(int i = 0; i < m; ++i)
21             {
22                 if(j == n-1)    d[i][j] = a[i][j];    //±ß½ç
23                 else
24                 {
25                     int row[3] = {i-1, i, i+1};
26                     if(i == 0)    row[0] = m-1;
27                     if(i == m-1)    row[2] = 0;
28                     std::sort(row, row + 3);        //ÅÅÐòÒÔ±£Ö¤×ÖµäÐò×îС
29                     d[i][j] = INF;
30                     for(int k = 0; k < 3; ++k)
31                     {
32                         int v = d[row[k]][j+1] + a[i][j];
33                         if(v < d[i][j])
34                         {
35                             d[i][j] = v;
36                             next[i][j] = row[k];
37                         }
38                     }
39                 }
40                 if(j == 0 && d[i][j] < ans)
41                 {
42                     ans = d[i][j];
43                     first = i;
44                 }
45             }
46         }
47         printf("%d", first+1);
48         int i = next[first][0];
49         for(int j = 1; j < n; ++j)
50         {
51             printf(" %d", i+1);
52             i = next[i][j];
53         }
54         printf("\n%d\n", ans);
55     }
56
57     return 0;
58 }

代码君

转载于:https://www.cnblogs.com/AOQNRMGYXLMV/p/3999215.html

UVa 116 (多段图的最短路) Unidirectional TSP相关推荐

  1. 动态规划中的多段图问题

    多段图的最短路径问题:只有相邻的节点之间有联系 多段图的定义: 1.多段图是一个有向.无环.带权 图. 2.有且仅有一个起始结点(原点source) 和 一个终止结点(汇点target). 3.它有n ...

  2. 多段图的动态规划算法(C/C++)

    1. 实验环境 (1)Visual Studio 2019(32位调试器) (2)Windows 10 2. 多段图描述 多段图G = (V,E)是一个带权有向图,它具有以下特性: 图中的节点被划分成 ...

  3. 动态规划多段图和货郎担问题

    一.实验目的 1.掌握能用动态规划方法求解的问题应满足的条件: 2.加深对动态规划方法的理解与应用: 3.锻炼学生对程序跟踪调试能力: 4.通过本次实验的练习培养学生应用所学知识解决实际问题的能力. ...

  4. 动态规划求解多段图问题

    动态规划求解多段图问题(非递归) 问题描述 求解思路 动态规划逆序解法 逆序实现代码 动态规划逆序解法 顺序实现代码 问题描述 如图所示,在A处有一水库,现需要从A点铺设一条管道到E点,边上的数字表示 ...

  5. 算法-动态规划2图问题-多段图的最短路径问题

    算法-动态规划2-多段图的最短路径问题 多段图的最短路径问题 问题:设图G=(V,E)是一个带权有向图,如果把顶点集合V划分成k个互不相交的子集Vi(2<=k<=n,1<=i< ...

  6. 动态规划求解多段图最短路径

    动态规划求解多段图最短路径 题目: 分析见源代码注释 源代码: #include<stdio.h> #define N 10//定义定点数,编号从1开始 #define M 5//定义层数 ...

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

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

  8. 在c语言中nextarc是什么意思,c语言求解多段图〔向前处理法〕.docx

    c语言求解多段图[向前处理法] #include#include#define Infinity 1000 //无穷大#define Max 45#define null 0 typedef stru ...

  9. 动态规划——多段图问题

    多段图问题 多段图问题是利用动态规划思想解决的经典问题之一,在日常生活中应用广泛. 问题描述 若存在一个有向加权图G,且G能分出起点和终点以及中间的n的阶段,求起点到终点的最短(长)距离. 分析设计 ...

最新文章

  1. 用友登录控件Vbs脚本
  2. Yii2 HOW-TO(3):调试工具yii2-debug和Xdebug(失败)
  3. python程序如何循环_在Python的一段程序中如何使用多次事件循环详解
  4. 检测数据类型的几种方式
  5. SCCM 2012 SP1系列(九)配置补丁更新-2
  6. 20170908校内训练
  7. halcon select_shape_xld按区域大小描绘xld
  8. [css] 当拿到一个新的项目,让你对这个项目的css做下架构设计,你该如何下手?
  9. java rcfile,hsqldb sqltool rcfile不起作用
  10. 为什么电脑屏幕会横过来_笔记本电脑屏幕横过来了怎么办?笔记本电脑屏幕倒过来了恢复方法...
  11. nginx解析php详细教程,Nginx与PHP交互过程步骤详解
  12. 开源Java商城项目Javashop的部署过程
  13. 手机浏览器电脑版有什么作用,手机浏览器如何设置成电脑版
  14. 魅族16 USB连接计算机,在魅族16x中连接电脑的方法分享
  15. (深入篇)漫游语音识别技术—带你走进语音识别技术的世界
  16. Edge、Chrome自定义新标签页网址
  17. 下午又出去……还不是为自己办事儿……电脑最近也开始闹别扭 ◎◎
  18. 剑指 Offer 32 - I. 从上到下打印二叉树(Java迭代法实现)
  19. 基于 高德 + Windvane 的H5选址工具,纵享丝滑,对高德选址组件说:走你
  20. app逆向篇之常用命令及刷机

热门文章

  1. Linux系统基本操作(一)—光盘挂载/卸载
  2. 不用写代码的可视化大屏,一口气把工具和方法都教给你
  3. 看完数据分析师一天的工作,才明白为什么人家年薪50W
  4. 从基础到分析,聊一聊企业报表平台的建设规划!
  5. Adobe Flex UIComponent LifeCycle
  6. centos屏幕视频录制,转换
  7. thumbnails 变黑_phpcms v9图片生成缩略图变成黑色解决方法
  8. C# list删除 另外list里面的元素_[Python]列表(list)操作
  9. 数据结构实验 5.二叉树深度
  10. PyTorch——解决报错“RuntimeError: running_mean should contain *** elements not ***”