逆推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. 配置openfire环境

    Openfire 的安装和配置 1. 下载最新的openfire安装文件 官方下载站点:http://www.igniterealtime.org/downloads/index.jsp#openfi ...

  2. day33

    今日内容: 1.关于UDP传输的模拟实现 2.使用socketserver模块实现TCP传输的并发操作 3.进程理论的介绍 1.关于UDP传输的模拟实现 模拟UDP传输与之前的模拟TCP传输大致相同 ...

  3. Json.NET如何避免循环引用

    Json.NET在将对象序列化为Json字符串的时候,如果对象有循环引用的属性或字段,那么会导致Json.NET抛出循环引用异常. 有两种方法可以解决这个问题: 1.在对象循环引用的属性上打上[Jso ...

  4. 20155323刘威良《网络对抗》Exp9 Web安全基础

    20155323刘威良<网络对抗>Exp9 Web安全基础 实践目的 理解常用网络攻击技术的基本原理. 实践内容 Webgoat实践下相关实验. 实践过程 开启WebGoat WebGoa ...

  5. Web安全基础实践

    Web安全基础实践 标签(空格分隔): <> 目录 基础问题回答 WebGoat下载安装 SQL注入攻击 - SQL字符串注入(String SQL Injection) - 数字型SQL ...

  6. C# 获取汉字拼音首字母/全拼

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   本节探讨C#获取汉字拼音首字母的方法: 代码类东西, ...

  7. Vue 使用细节收集

    JSX 中 on 开头的属性名 在用 elementui 中的 el-upload 的时候,他们组件中有一个属性 on-change ,也不知道谁想出来的属性名,太扯淡了,非要 on 开头,我开始的代 ...

  8. 【HNOI2016】矿区

    题面 题解 知识引入 1. 平面图 一个图\(G=(V,E)\),若能将其画在平面上,且任意两条边的交点只能是\(G\)的顶点,则称\(G\)可嵌入平面,或称\(G\)是可平面的. 可平面图在平面上的 ...

  9. [计算机视觉] 图像拼接 Image Stitching

    [计算机视觉] 图像拼接 Image Stitching 2017年04月28日 14:05:19 阅读数:1027 作业要求: 1.将多张图片合并拼接成一张全景图(看下面效果图) 2.尽量用C/C+ ...

  10. C#_Winfrom将浏览器生成Image

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...