题目传送门:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=52

题意:

给一个m行n列的矩阵,现让你从最左边走到最右边,求经过路径上的权值最小,并输出路径和最小值,如果有多条路径的权值和都是最小值,输出字典序最小的那一条

走的规则:

1.只能从当前列走到下一列

2.假设当前行是第i行,只能走到下一列的第i-1行、第i行、第i+1行

3.第一行的上一行是最后一行,最后一行的下一行是第一行

思路:

设置dp[i][j]是在第i行第i列时到最后一列的最小值,将整个图存在pl[m][n]里面,那么不难发现对任意一个位置有如下三种决策:

1.dp[i][j]=dp[i-1][j+1]+pl[i][j]

2.dp[i][j]=dp[i][j+1]+pl[i][j]

3.dp[i][j]=dp[i+1][j+1]+pl[i][j]

那么怎么记录路径呢???

可以用一个pos[m][n]来记录路径,其值是第i行第j列在满足最优情况下的下一个状态的行数。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <algorithm>
#include <vector>
#include <stack>
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:102400000,102400000")
using namespace std;
int m, n;
int pl[15][110];
int pos[15][110];
int dp[15][110];
int main()
{while(~scanf("%d%d", &m, &n)){memset(pl, 0, sizeof(pl));memset(pos, 0, sizeof(pos));for(int i=0; i<m; i++)for(int j=0; j<n; j++)scanf("%d", &pl[i][j]);for(int j=n-1; j>=0; j--){for(int i=0; i<m; i++){if(j==n-1){dp[i][j]=pl[i][j];continue;}int row[3]={i-1, i, i+1};  //用row数组保存三种决策的行if(i==0) row[0]=m-1;if(i==m-1) row[2]=0;sort(row, row+3);    //排序保证在值相同的情况下,字典序最小dp[i][j]=INF;for(int k=0; k<3; k++){int val=dp[row[k]][j+1]+pl[i][j];if(val<dp[i][j]){dp[i][j]=val;pos[i][j]=row[k];   //保存路径}}}}int first;int ans=INF;for(int i=0; i<m; i++)   //搜寻最小的值,同时从小到大地搜保证了字典序最小if(ans>dp[i][0]){ans=dp[i][0];first=i;}printf("%d", first+1);    //输出第一列的行数for(int i=first, cnt=0; cnt<n-1; cnt++){printf(" %d", pos[i][cnt]+1);i=pos[i][cnt];}printf("\n%d\n", ans);}return 0;
}

动态规划——单向 DSP相关推荐

  1. UVA116 单向 DSP(多段图最短路)

    单向 DSP [题目链接]单向 DSP [题目类型]dp &题解: 紫书P271 这块的字典序排序我觉得挺厉害的,每次都把那3步sort一下,之后if (v< d[i][j]) 这块的小 ...

  2. 动态规划算法的优化技巧

    动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化.全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因 ...

  3. NOIP竞赛学习整理--动态规划算法举例P1264

    动态规划 什么是动态规划? 动态规划是解决多阶段决策最优化问题的一种思想方法.所谓"动态",指的是在问题的多阶段决策中,按某一顺序,根据每一步所选决策的不同,将随即引起状态的转移, ...

  4. java 动态规划视频_157-动态规划算法解决背包问题1

    2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...

  5. 【练习】2021下半年数据结构刷题笔记和总结 (一)(图和动态规划)

    文章目录 1.编程将一个字符串中所有空格替换为"%20" 2.定两个字符串,判断一个字符串是否是另一个字符串的排列 3.求一个房间内有数个钩子,给定一定长度的绳索,要把所有的钩子用 ...

  6. 二极管为什么单向导电?

    二极管是电子电路中很常用的元器件,非常常见,二极管具有正向导通,反向截止的特性. 在二极管的正向端(正极)加正电压,负向端(负极)加负电压,二极管导通,有电流流过二极管.在二极管的正向端(正极)加负电 ...

  7. 提高篇 第五部分 动态规划 第4章 状态压缩类动态规划

    例1 骑士(Sgu223) 1592:[例 1]国王 信息学奥赛一本通(C++版)在线评测系统 https://blog.csdn.net/guoyangfan_/article/details/82 ...

  8. 1261:【例9.5】城市交通路网 《信息学奥赛一本通:动态规划基础》

    http://ybt.ssoier.cn:8088/problem_show.php?pid=1261 图表示城市之间的交通路网,线段上的数字表示费用, 单向通行由A->E. 试用动态规划的最优 ...

  9. 基于GIO/FVID的DSP视频驱动程序

    随着时代的发展,DSP技术在远程监控.可视电话.工业检测等视频处理领域得到了广泛的应用,对于不同的视频处理系统,会使用不同的视频设备,所以有必要为视频没备设计驱动程序,为高层应用程序提供统一的接口来操 ...

最新文章

  1. Go语言命令行库urfave/cli简介
  2. iso qemu 安装ubuntu_基于libvirt 和QEMU在macOS安装Ubuntu
  3. 【微信小程序】带你做一个公众号留言系统(附源码)
  4. 基于随机游走的图嵌入之快速指南
  5. 真实的产品案例:实现文档边缘检测
  6. JDBC链接MySQL数据库
  7. Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth
  8. FPGA信号处理系列文章——卷积编码与维特比译码
  9. 基于VRML的虚拟校园漫游系统
  10. vue 一个公式 编辑器 组件
  11. Win10系统微信,QQ打语音听不见声音
  12. Mocking Void Methods with Mockito
  13. Laravel SQL查询中first, pluck与lists方法
  14. docker及k8s容器面试精华汇总(一),祝大家顺利通过企业面试!
  15. prometheus监控告警功能
  16. js计算两个日期时间的差值
  17. 判断是不是平衡二叉树
  18. js实现小游戏 贪吃蛇
  19. geoip java api_利用GeoIP数据库及API进行地理定位查询 Java
  20. layui 隐藏表头不生效

热门文章

  1. html边框如何制作三角形,1分钟解读使用css-border制作小三角
  2. 企业微信怎么用?企业微信怎么设置入群欢迎语?
  3. CocoaPods安装最新版
  4. ipsec VPN技术(基础篇二)
  5. 【PYQT】制作可以显示图片的抽卡模拟器
  6. 大型机/IBM大型机 简介
  7. mysql8.0连接时长配置_初学者在Mysql8.0连接时的几个常见基本问题
  8. 形位公差的定义与符号
  9. 小学三年级计算机上册课后反思,小学三年级上册教学反思三篇
  10. 经典供货保密协议模板