一、题目

给一个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的更多相关文章

  1. 清北学堂—2020.1提高储备营—Day 4 afternoon(动态规划初步(一))

    qbxt Day 4 afternoon --2020.1.20 济南 主讲:顾霆枫 目录一览 1.动态规划初步 2.记忆化搜索 3.递推式动态规划 4.记忆话搜索与递推式动态规划的转化 5.状态转移 ...

  2. 动态规划初步--最长上升子序列(LIS)

    一.问题 有一个长为n的数列 a0,a1,a2...,an-1a.请求出这个序列中最长的上升子序列的长度和对应的子序列.上升子序列指的是对任意的i < j都满足ai < aj的子序列. 二 ...

  3. 什么是动态规划?动态规划的意义是什么?https://www.zhihu.com/question/23995189

    阮行止 上海洛谷网络科技有限公司 讲师 intro 很有意思的问题.以往见过许多教材,对动态规划(DP)的引入属于"奉天承运,皇帝诏曰"式:不给出一点引入,见面即拿出一大堆公式吓人 ...

  4. OI暑假集训游记

    莞中OI集训游记 Written BY Jum Leon. I        又是一载夏,本蒟蒻以特长生考入莞中,怀着忐忑的心情到了8月,是集训之际.怀着对算法学习的向往心情被大佬暴虐的一丝恐惧来到了 ...

  5. [bzoj\lydsy\大视野在线测评]题解(持续更新)

    目录: 一.DP 二.图论 1.最短路 2.强连通分量 三.利用单调性维护 四.贪心 五.数据结构 1.并查集 六.数学 1.计数问题 2.数学分析 七.博弈 八.搜索 /////////////// ...

  6. 帝都Day3——各种dp

    备注:Day1 Day2记得笔记太233,所以就不发了 备注2:Day4~Day7发不发看心情qaq (7.17持续更新中...) 动态规划A 记忆化搜索 & 动态规划初步 8点15: 杨姓d ...

  7. 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 ...

  8. 1D1D动态规划优化初步

    再学习一下动态规划的基本优化方法- 首先这篇文章应该大家都看过吧-没看过的自行百度 关于实现的思路文章里都给好了-这篇就主要给一点题目啥的 (P.S. 电脑重装了,如果博客发出来有一些奇怪的问题不要在 ...

  9. Azure底层架构的初步分析

    之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...

随机推荐

  1. Spring Boot 学习系列(04)—分而治之,多module打包

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 明确功能,各司其职 在一个结构清晰的项目中,一个没有module划分的结构显然不是最佳实践.有人会说可以在同 ...

  2. SpringCloud之旅第一篇-微服务概念

    一.单体架构的问题 微服务为什么会出现?在学习Springboot的时候知道Springboot极大的简化了我们的开发,我们可以快速的进行业务开发,Springboot单体应用在项目的开发初期能够满足 ...

  3. console.log是异步么?

    让我们来看一个例子: var a = {}; console.log(a); a.foo = 'foo'; 4 console.log(a); 但是问题来了:在chorme跟firfox一样么? 结果 ...

  4. 文档通信(跨域-不跨域)、时时通信(websocket)、离线存储(applicationCache)、开启多线程(web worker)

    一.文档间的通信 postMessage对象 //不跨域 1.iframe:obj.contentWindow [iframe中的window对象] iframe拿到父级页面的window: pare ...

  5. 监控利器---Zabbix(一)

    开源监控软件对比 Cacti(英文含义仙人掌) 是一套基于PHP.MySQL.SNMP和RRDtool开发的网络流量监测图形分析工具,它通过snmpget来获取数据使用RRDtool绘图,简化RRDt ...

  6. Django框架简介,wsgiref 与 jinja2 模块

    目录 框架简介 wsgiref模块 jinja2 模块 框架简介 Django是一个web开发框架,用来开发web应用,本质就是, web框架+socket服务端 MVC框架和MTV框架 MVC,全名 ...

  7. 即时通讯新手入门:一文读懂什么是Nginx?它能否实现IM的负载均衡?

    本文引用了“蔷薇Nina”的“Nginx 相关介绍(Nginx是什么?能干嘛?)”一文部分内容,感谢作者的无私分享. 1.引言   Nginx(及其衍生产品)是目前被大量使用的服务端反向代理和负载均衡 ...

  8. PAT甲级——1118 Birds in Forest (并查集)

    此文章 同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/89819984   1118 Birds in Forest  ...

  9. [題解]luogu_P1120小木棍(搜索)

    好久以前抄的題解,現在重新抄題解做一下 1.對所有木棍從大到小排序,後用小的比較靈活 2.限制加入的木棍單調遞減,因為先/后用長/短木棍等價,反正就是那兩根 3.預處理出重複木棍的位置,防止重複搜索相 ...

  10. Django的锁和事务

    Django的锁和事务 锁 select_for_update(nowait=False, skip_locked=False) 返回一个锁住行直到事务结束的查询集,如果数据库支持,它将生成一个 SE ...