逆推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])
\]

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


代码好说:

#include <iostream>
#include <cstdio>
#define fin cin//测试来着
#define fout cout using namespace std;
typedef long long int lli;
const int maxn=2000,maxm=2000;
lli f[maxm+1][maxn+1],work[maxm+1][maxn+1];
//f[i][j]表示当前第i个小组第j步的最优结果
lli n,m,ans=2147483647; inline lli max(lli a,lli b) {
return a>=b?a:b;
}
inline lli min(lli a,lli b) {
return a<=b?a:b;
} int main() {
fin>>n>>m;
for (register int i=1; i<=m; i++) {
for (register int j=1; j<=n; j++) {
fin>>work[i][j];
}
}
//上面是按照表读的
for (register int i=1; i<=m; i++) {
f[i][1]=work[i][1];
}
//第一步就是原先第一列的内容
for (register int i=2; i<=n; i++) {
//从第二步骤开始推
for (register int j=1; j<=m; j++) {
//j是当前到了第几个小组
if (j==1) {
f[j][i]=min(f[m][i-1]+work[j][i],f[j][i-1]+work[j][i]);
}
else {
f[j][i]=min(f[j-1][i-1]+work[j][i],f[j][i-1]+work[j][i]);
}
}
}
for (register int i=1; i<=m; i++) {
ans=min(ans,f[i][n]);
}
cout<<ans;
return 0;
}

题解 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. python 爬虫--同花顺-使用代理

    1.http://www.goubanjia.com/  在上面获取 使用http协议的公网IP和端口 参考:https://blog.csdn.net/qq_23934063/article/det ...

  2. defaultdict - update - pymysql

    defaultdict 的例子 使用list作为default_factory,他很容易的将一个以键值形式表现的序列分组成一个字典列表 >>> s = [('yellow', 1), ...

  3. shell编程的笔记

    关于历史命令 Shell相关 !! 是上一次执行的命令 !字符串  指执行最近一次以这个字符串开头的命令 !$ 取出上一条命令最后一个单词或命令 *匹配0个或多个字符         ?匹配一个字符 ...

  4. linux下通过软连接实现访问项目路径外面的资源

            在javaweb项目开发中,图片上传是个比较常见的场景.一般都是在项目路径下建个文件夹,然后上传到该文件夹下:这样这个图片就可以和静态资源一样被直接访问.这样的好处就是访问这图片特别方 ...

  5. 汇编 循环位移指令 ROL, 循环位移指令 ROR

    知识点:  循环位移指令 ROL  循环位移指令 ROR 一.循环位移指令 ROL ROR int i=0x77886611;//01110111100010000110011000010001 ...

  6. python 单体模式 的几种实现

    这是本人的一篇学习笔记. 本文用 python 实现单体模式,参考了这里 一.修改父类的 __dict__ class Borg: _shared_state = {} def __init__(se ...

  7. 腾讯云CVM服务器怎么建网站

    腾讯云云服务器CVM站在用户的角度看就相当于一台计算机,虽然实际上它是一个虚拟服务器,是一个大的云端服务器集群虚拟出来的一个虚拟服务器,在使用上直接当做一个实际的服务器即可.那么,对于一个新手菜鸟来说 ...

  8. xgboost学习与总结

    最近在研究xgboost,把一些xgboost的知识总结一下.这里只是把相关资源作总结,原创的东西不多. 原理 xgboost的原理首先看xgboost的作者陈天奇的ppt 英文不太好的同学可以看看这 ...

  9. Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管理

    这篇文章我们来学习如何使用 Spring Boot 集成 Apache Shiro .安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求.在 Java 领域一般有 Spring S ...

  10. MOSFET的小信号模型和频率响应

    这部分内容大部分参考W.Y.Choi的课堂讲义第三讲和第四讲:http://tera.yonsei.ac.kr/class/2007_1/main.htm 一.小信号模型 首先要明确一点,大部分情形M ...