逆推dp经典题目:数字三角形的折叠版

为什么这么说?

因为我们会发现:除了每一次都特判一下是否转换行号以外,剩下的思想没什么不同。

没看题目的看这里


先定义:

n,m是步骤数目,小组数目

work[i][j]表示第i个小组第j步需要的天数

f[i][j]表示当前第i个小组第j步的最优天数

首先我们先看到这个题说是要求最小天数

然后我们知道这个最小天数是由原先的两个最小天数分别加上当前小组工作天数,然后二者求最小值(因为前面的两个子状态——天数决定了后面的状态——当前最小天数)

这中间告诉我们当最下面的小组还想向下找小组,就返回最上面的小组1

所以我们得出几个推论:

  1. 因为最后不同的小组会得到不同的值,所以我们应当求出最后一步中的最小天数值(最小值跑最后一列一遍)
  2. 普通(指的是不看第三点)的dp状态转移方程就是

\[f[i][j]=min(f[i-1][j-1]+work[i][j],f[i][j-1]+work[i][j])
\]

  1. 逆着想,当i=1的时候,决定当前最小天数的是i=ni=1两个子状态,所以当i=1的时候,转移的i-1就应当变成n

    于是得出下面的递推式:

\[f[i][j]=min(f[i!=1?i-1:n][j-1]+work[i][j],f[i][j-1]+work[i][j])
\]

这样这个题的思路就做完了。


代码好说:

  1. #include <iostream>
  2. #include <cstdio>
  3. #define fin cin//测试来着
  4. #define fout cout
  5. using namespace std;
  6. typedef long long int lli;
  7. const int maxn=2000,maxm=2000;
  8. lli f[maxm+1][maxn+1],work[maxm+1][maxn+1];
  9. //f[i][j]表示当前第i个小组第j步的最优结果
  10. lli n,m,ans=2147483647;
  11. inline lli max(lli a,lli b) {
  12. return a>=b?a:b;
  13. }
  14. inline lli min(lli a,lli b) {
  15. return a<=b?a:b;
  16. }
  17. int main() {
  18. fin>>n>>m;
  19. for (register int i=1; i<=m; i++) {
  20. for (register int j=1; j<=n; j++) {
  21. fin>>work[i][j];
  22. }
  23. }
  24. //上面是按照表读的
  25. for (register int i=1; i<=m; i++) {
  26. f[i][1]=work[i][1];
  27. }
  28. //第一步就是原先第一列的内容
  29. for (register int i=2; i<=n; i++) {
  30. //从第二步骤开始推
  31. for (register int j=1; j<=m; j++) {
  32. //j是当前到了第几个小组
  33. if (j==1) {
  34. f[j][i]=min(f[m][i-1]+work[j][i],f[j][i-1]+work[j][i]);
  35. }
  36. else {
  37. f[j][i]=min(f[j-1][i-1]+work[j][i],f[j][i-1]+work[j][i]);
  38. }
  39. }
  40. }
  41. for (register int i=1; i<=m; i++) {
  42. ans=min(ans,f[i][n]);
  43. }
  44. cout<<ans;
  45. return 0;
  46. }

题解 P1130 【红牌】的更多相关文章

  1. 洛谷 P1130 红牌

    P1130 红牌 题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程 ...

  2. P1130 红牌(动态规划)

    P1130 红牌 思路如下 这一题很像数字金字塔,我们可以正着求最小时间,当然也可以逆着求最小时间, 如果正着求:那么我们怎么求状态转移方程呢?,在这里我们假定状态转移方程为:dp[ i ][ j ] ...

  3. 洛谷P1130 红牌

    题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派了 ...

  4. P1130 红牌

    题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括NN个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派 ...

  5. 洛谷——P1130 红牌

    题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派了 ...

  6. 洛谷P1130红牌(简单DP)

    题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括NNN个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都 ...

  7. Luogu【P1130】红牌(DP)

    欧拉 本蒟蒻第一个自己想出来的DP题 请移步题目链接 调了半天.i从1到n,j从1到m. f[i][j]表示的是第i道工序在第j个小组办完所花的最短时间. 因为要用到上一个状态,而上一个状态要么是同一 ...

  8. [USACO07OCT]障碍路线 & yzoj P1130 拐弯 题解

    题意 给出n* n 的图,A为起点,B为终点,* 为障碍,.可以行走,问最少需要拐90度的弯多少次,无法到达输出-1. 解析 思路:构造N * M * 4个点,即将原图的每个点分裂成4个点.其中点(i ...

  9. 【u120】红牌

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤 ...

随机推荐

  1. jqgrid 分页时,清空原表格数据加载返回的新数据

    由于,我们是动态分页,分页后的数据是在触发分页后动态加载而来.如何使jqgrid清空原数据而加载新数据? 1)调用jqgrid的 clearGridData 方法清空表格数据 2)调用jqgrid的  ...

  2. chrome调试如何禁用浏览器缓存

    0.写在前面的话 遇到过很多很多次,修改了页面代码,但是程序始终没有按照设想的方向走,有时候折腾了几个小时,发现问题最后却是莫名其妙恢复的.后来进一步调试发现,自己已经修改了如js代码,但是前端在载入 ...

  3. 【chrome】安装证书并配置为受信任网站连接(windows)

    当出现网站连接非私密连接不受信任时,可添加证书crt文件到系统证书里设置为受信任 1.chrome设置中, 高级-- 管理证书 2.选择  受信任的根证书颁发机构 -- 导入 3.下一步  找到所需要 ...

  4. 2017-2018-2 20155224 『网络对抗技术』Exp9:Web安全基础

    实验完成情况 共完成11题 准备工作 在浏览器输入localhost:8080/WebGoat打开webgoat,左侧选择题目 右键选择Inspect Element开始调试 Injection Fl ...

  5. SpingMVC的<context:component-scan>包扫描踩坑记录

        公司项目配置的Spring项目的包扫描有点问题,出现了一个被Spring容器管理的Bean被创建了2次的现象.在此记录下解决的过程,方便后续查阅. 改动前: 容器启动监听器中会扫描全部包,创建 ...

  6. mfc 嵌套类

    嵌套类 一. 嵌套类 嵌套类的定义 将某个类的定义放在另一个类的内部,这样的类定义,叫嵌套类. class AAA { int aaa; class BBB { int bbb; //其它成员或者函数 ...

  7. Bluedroid协议栈HCI线程分析

    蓝牙进程中有多个线程,其中HCI 线程是负责处理蓝牙主机端和控制器的数据处理和收发的工作. 本篇文章就是分析一下该线程的数据处理流程. 1.跟HCI相关的接口 首先看看hci的相关的接口:在hci_l ...

  8. 手机Gmail上用Exchange协议配置收发QQ邮箱

    1.开启Exchange服务  2.生成授权码(登录密码)  3."服务器"填入ex.qq.com

  9. OpenGL 笔记 <2> Compiling and Linking a shader program

    Preface 这一节所有的主要内容都在一个OpenGL库文件中<LoadShaders.h> ,只需要用LoadShader()函数进行加载即可.但是由于老是出错,所以自己实现了一下,也 ...

  10. unity中camera摄像头控制详解

    目录 1. 缘起 2. 开发 2.1. 建立项目 2.2. 旋转 2.2.1. 四元数 2.3. 移动 2.3.1. 向量操作 2.4. 镜头拉伸 2.5. 复位 2.6. 优化 1 缘起 我们的产品 ...