动态规划初步-单向STP
一、题目
给一个m行n列(m <= 10,n <= 100)的整数矩阵,从第一列任何位置出发每次往右、右下、右上走一格,最终达到最后一列。要求经过的整数之和最小。整个矩阵是环形的,即第一行的上一行是最后一行,最后一行的下一行是第一行。输路径上每一列的行号及路径上的整数和,多解时输出字典序最小的。
二、解题思路
我们按列考虑,从最后一列开始,每一列可以由前一列决定,设dp[i][j]表示由格子(i,j)到最后一列的最小开销。于是有dp[i][j] = max(dp[i][j + 1],dp[i - 1][j + 1],dp[i +1][j + 1])。把最后一列初始化为其本身,从右至左可得到每一列的情况,取第一列中的最小即可。由于要输出路径,用nextpos[i][j]记录在j+1列时选取的行坐标。字典序的处理见代码注释。
三、代码实现
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std; const int INF = 0x3f3f3f3f;
const int maxm = + ;
const int maxn = + ;
int maze[maxm][maxn],dp[maxm][maxn]; //dp[i][j]表示从(i,j)出发到最后一列的最小值
int nextpos[maxn][maxn]; //nextpos[i][j]记录在j+1列时选取的行坐标
int m, n; void slove()
{
int ans = INF, first = ;
for (int j = n - ; j >= ; j--) //从右至左
{
for (int i = ; i < m; i++)
{
if (j == n - ) dp[i][j] = maze[i][j]; //边界
else
{
int rows[] = {i,i - ,i+};
if (i == ) rows[] = m - ; //注意考虑m = 1、2
if (i == m - ) rows[] = ;
sort(rows, rows + ); //保证字典序最小
dp[i][j] = INF;
for (int k = ; k < ; k++)
{
int tmp = dp[rows[k]][j + ] + maze[i][j];
if (tmp < dp[i][j])
{
dp[i][j] = tmp;
nextpos[i][j] = rows[k]; //dp更新,nextpos也会更新,这保证了nextpos记录的是最优路径
}
}
}
if (j == && dp[i][j] < ans)
{
ans = dp[i][j];
first = i;
}
}
} printf("%d", first + );
for (int i = nextpos[first][],j = ; j < n; j++)
{
printf(" %d", i + );
i = nextpos[i][j];
}
printf("\n%d\n", ans);
} int main()
{
while (scanf("%d%d",&m,&n) == )
{
for (int i = ; i < m; i++)
for (int j = ; j < n; j++)
scanf("%d", &maze[i][j]); slove();
}
return ;
}
动态规划初步-单向STP的更多相关文章
- 清北学堂—2020.1提高储备营—Day 4 afternoon(动态规划初步(一))
qbxt Day 4 afternoon --2020.1.20 济南 主讲:顾霆枫 目录一览 1.动态规划初步 2.记忆化搜索 3.递推式动态规划 4.记忆话搜索与递推式动态规划的转化 5.状态转移 ...
- 动态规划初步--最长上升子序列(LIS)
一.问题 有一个长为n的数列 a0,a1,a2...,an-1a.请求出这个序列中最长的上升子序列的长度和对应的子序列.上升子序列指的是对任意的i < j都满足ai < aj的子序列. 二 ...
- 什么是动态规划?动态规划的意义是什么?https://www.zhihu.com/question/23995189
阮行止 上海洛谷网络科技有限公司 讲师 intro 很有意思的问题.以往见过许多教材,对动态规划(DP)的引入属于"奉天承运,皇帝诏曰"式:不给出一点引入,见面即拿出一大堆公式吓人 ...
- OI暑假集训游记
莞中OI集训游记 Written BY Jum Leon. I 又是一载夏,本蒟蒻以特长生考入莞中,怀着忐忑的心情到了8月,是集训之际.怀着对算法学习的向往心情被大佬暴虐的一丝恐惧来到了 ...
- [bzoj\lydsy\大视野在线测评]题解(持续更新)
目录: 一.DP 二.图论 1.最短路 2.强连通分量 三.利用单调性维护 四.贪心 五.数据结构 1.并查集 六.数学 1.计数问题 2.数学分析 七.博弈 八.搜索 /////////////// ...
- 帝都Day3——各种dp
备注:Day1 Day2记得笔记太233,所以就不发了 备注2:Day4~Day7发不发看心情qaq (7.17持续更新中...) 动态规划A 记忆化搜索 & 动态规划初步 8点15: 杨姓d ...
- bzoj 1010 (单调决策优化)
能够非常好的证明单调决策性质.用 记sum[i]=sigma(C[1],C[2].....C[k]);f[i]=sum[i]+i; c=l-1; 有转移dp[i]=min( dp[j]+(f[i ...
- 1D1D动态规划优化初步
再学习一下动态规划的基本优化方法- 首先这篇文章应该大家都看过吧-没看过的自行百度 关于实现的思路文章里都给好了-这篇就主要给一点题目啥的 (P.S. 电脑重装了,如果博客发出来有一些奇怪的问题不要在 ...
- Azure底层架构的初步分析
之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...
随机推荐
- sublime入门文章
http://www.iplaysoft.com/sublimetext.html http://code-tech.diandian.com/post/2012-07-18/40030958791 ...
- 3DMAX 7 角色建模1 人头建模
说明: mesh与poly 可编辑多边形是一个多边形网格:即与可编辑网格不同,其使用超过三面的多边形.可编辑多边形非常有用,因为它们可以避免看不到边缘.例如,如果您对可编辑多边形执行切割和切片操作,程 ...
- 阿里云物联网 .NET Core 客户端 | CZGL.AliIoTClient:8. 委托事件
文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...
- git 版本控制(一)
新建代码库repository 1.在当前目录新建一个git代码库 git init git init projectname 2.下载一个项目,如果已经有了远端的代码,则可以使用clone下载 gi ...
- 转 JS 中的 this
转载至:https://segmentfault.com/a/1190000009215974 this的指向问题应该是让每一个前端er都头疼的问题,我也一样,曾经遇到甚至都是一顿乱猜.最近在研读一些 ...
- Gym - 101810A ACM International Collegiate Programming Contest (2018)
bryce1010模板 http://codeforces.com/gym/101810/problem/A 大模拟,写崩了,代码借队友的...... 注意处理段与段的连接问题: #include&l ...
- HTML图像标记
1.使用方法 <img src="路径/文件名.图片格式" width="属性值" height="属性值" border=" ...
- compile and link
1. C 中 头文件的作用? 2. difference between *.a and *.so? 3. object file and executable file 4. search path ...
- 转 php include
http://www.w3school.com.cn/php/php_includes.asp PHP include 实例 例子 1 假设我们有一个名为 "footer.php" ...
- [译]Understanding ECMAScript6 函数
函数 函数是任何编程语言的重要组成部分,而自从JavaScript被引入以来,JavaScript的函数就未有太多改变.遗留下来的积压问题及微妙行为使我们很容易犯错误,或者需要更多的代码来实现一个非常 ...