动态规划——单向 DSP
题目传送门: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相关推荐
- UVA116 单向 DSP(多段图最短路)
单向 DSP [题目链接]单向 DSP [题目类型]dp &题解: 紫书P271 这块的字典序排序我觉得挺厉害的,每次都把那3步sort一下,之后if (v< d[i][j]) 这块的小 ...
- 动态规划算法的优化技巧
动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化.全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因 ...
- NOIP竞赛学习整理--动态规划算法举例P1264
动态规划 什么是动态规划? 动态规划是解决多阶段决策最优化问题的一种思想方法.所谓"动态",指的是在问题的多阶段决策中,按某一顺序,根据每一步所选决策的不同,将随即引起状态的转移, ...
- java 动态规划视频_157-动态规划算法解决背包问题1
2.网上数据结构和算法的课程不少,但存在两个问题: 1)授课方式单一,大多是照着代码念一遍,数据结构和算法本身就比较难理解,对基础好的学员来说,还好一点,对基础不好的学生来说,基本上就是听天书了 2) ...
- 【练习】2021下半年数据结构刷题笔记和总结 (一)(图和动态规划)
文章目录 1.编程将一个字符串中所有空格替换为"%20" 2.定两个字符串,判断一个字符串是否是另一个字符串的排列 3.求一个房间内有数个钩子,给定一定长度的绳索,要把所有的钩子用 ...
- 二极管为什么单向导电?
二极管是电子电路中很常用的元器件,非常常见,二极管具有正向导通,反向截止的特性. 在二极管的正向端(正极)加正电压,负向端(负极)加负电压,二极管导通,有电流流过二极管.在二极管的正向端(正极)加负电 ...
- 提高篇 第五部分 动态规划 第4章 状态压缩类动态规划
例1 骑士(Sgu223) 1592:[例 1]国王 信息学奥赛一本通(C++版)在线评测系统 https://blog.csdn.net/guoyangfan_/article/details/82 ...
- 1261:【例9.5】城市交通路网 《信息学奥赛一本通:动态规划基础》
http://ybt.ssoier.cn:8088/problem_show.php?pid=1261 图表示城市之间的交通路网,线段上的数字表示费用, 单向通行由A->E. 试用动态规划的最优 ...
- 基于GIO/FVID的DSP视频驱动程序
随着时代的发展,DSP技术在远程监控.可视电话.工业检测等视频处理领域得到了广泛的应用,对于不同的视频处理系统,会使用不同的视频设备,所以有必要为视频没备设计驱动程序,为高层应用程序提供统一的接口来操 ...
最新文章
- Go语言命令行库urfave/cli简介
- iso qemu 安装ubuntu_基于libvirt 和QEMU在macOS安装Ubuntu
- 【微信小程序】带你做一个公众号留言系统(附源码)
- 基于随机游走的图嵌入之快速指南
- 真实的产品案例:实现文档边缘检测
- JDBC链接MySQL数据库
- Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Pyth
- FPGA信号处理系列文章——卷积编码与维特比译码
- 基于VRML的虚拟校园漫游系统
- vue 一个公式 编辑器 组件
- Win10系统微信,QQ打语音听不见声音
- Mocking Void Methods with Mockito
- Laravel SQL查询中first, pluck与lists方法
- docker及k8s容器面试精华汇总(一),祝大家顺利通过企业面试!
- prometheus监控告警功能
- js计算两个日期时间的差值
- 判断是不是平衡二叉树
- js实现小游戏 贪吃蛇
- geoip java api_利用GeoIP数据库及API进行地理定位查询 Java
- layui 隐藏表头不生效