第五讲 动态规划
包括背包问题,线性DP,区间DP,计数类DP,数位统计DP,状态压缩DP,树形DP,记忆化搜索等内容。
falldeep
远和近
展开
-
完全背包问题代码二维转一维
二维代码 for(int i = 1; i <= n; i ++)//种类 for(int j = 1; j <= m; j ++)//背包容量 { //可能会出现第i个物品放不进背包的情况,因此先写这条,再加个判断 f[i][j] = f[i - 1][j]; if(v[i] <= j) f[i][j] = max(f[i][j], f[i][j - v[i]] + w[i]); }转换过程,删掉第一维i for(int i =原创 2022-03-25 22:37:44 · 307 阅读 · 0 评论 -
最短编辑距离(线性DP)
题目给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有:删除–将字符串A中的某个字符删除。 插入–在字符串A的某个位置插入某个字符。 替换–将字符串A中的某个字符替换为另一个字符。现在请你求出,将A变为B至少需要进行多少次操作。输入格式第一行包含整数n,表示字符串A的长度。第二行包含一个长度为n的字符串A。第三行包含整数m,表示字符串B的长度。第四行包含一个长度为m的字符串B。字符串中均只包含大写字...原创 2021-08-02 15:49:38 · 24636 阅读 · 0 评论 -
最长公共子序列(线性DP)
题目给定两个长度分别为N和M的字符串A和B,求既是A的子序列又是B的子序列的字符串长度最长是多少。输入格式第一行包含两个整数N和M。第二行包含一个长度为N的字符串,表示字符串A。第三行包含一个长度为M的字符串,表示字符串B。字符串均由小写字母构成。输出格式输出一个整数,表示最大长度。数据范围1≤N,M≤1000输入样例:4 5acbdabedc输出样例:3思想代码#include&...原创 2021-08-02 14:59:13 · 24587 阅读 · 0 评论 -
石子合并(区间DP)
题目设有N堆石子排成一排,其编号为1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有44堆石子分别为1 3 5 2, 我们可以先合并1、2 堆,代价为4,得到4 5 2, 又合并1,2堆,代价为9,得到9 2,再合并得到 11,总代价为4+9+11=24;如果...原创 2021-08-03 13:50:43 · 24742 阅读 · 0 评论 -
滑雪(记忆化搜索)
题目给定一个R行C列的矩阵,表示一个矩形网格滑雪场。矩阵中第i行第j 列的点表示滑雪场的第i行第j列区域的高度。一个人从滑雪场中的某个区域内出发,每次可以向上下左右任意一个方向滑动一个单位距离。当然,一个人能够滑动到某相邻区域的前提是该区域的高度低于自己目前所在区域的高度。下面给出一个矩阵作为例子: 1 2 3 4 516 17 18 19 615 24 25 20 714 23 22 21 813 12 11 10 9在给定矩阵中...转载 2021-08-06 23:00:26 · 24574 阅读 · 0 评论 -
整数划分(计数类DP)
题目一个正整数n可以表示成若干个正整数之和,形如:n=n1+n2+…+nk,其中n1≥n2≥…≥nk,k≥1。我们将这样的一种表示称为正整数n的一种划分。现在给定一个正整数n,请你求出n共有多少种不同的划分方法。输入格式共一行,包含一个整数n。输出格式共一行,包含一个整数,表示总划分数量。由于答案可能很大,输出结果请对109+7 取模。数据范围1≤n≤1000输入样例:5输出样例:7解法1代码#i...原创 2021-08-03 17:25:44 · 24638 阅读 · 0 评论 -
蒙德里安的梦想(状态压缩DP)
题目求把N×M 的棋盘分割成若干个 1×2的的长方形,有多少种方案。例如当N=2,M=4 时,共有5种方案。当N=2,M=3 时,共有3种方案。如下图所示:输入格式输入包含多组测试用例。每组测试用例占一行,包含两个整数N和M。当输入用例N=0,M=0 时,表示输入终止,且该用例无需处理。输出格式每个测试用例输出一个结果,每个结果占一行。数据范围1≤N,M≤11输入样例:1 21 31 42 22 32 42 11...原创 2021-08-05 20:52:25 · 24689 阅读 · 3 评论 -
编辑距离(线性DP)
题目给定n个长度不超过10的字符串以及m次询问,每次询问给出一个字符串和一个操作次数上限。对于每次询问,请你求出给定的n个字符串中有多少个字符串可以在上限操作次数内经过操作变成询问给出的字符串。每个对字符串进行的单个字符的插入、删除或替换算作一次操作。输入格式第一行包含两个整数n和m。接下来n行,每行包含一个字符串,表示给定的字符串。再接下来m行,每行包含一个字符串和一个整数,表示一次询问。字符串中只包含小写字母,且长度均不超过10。输出格...原创 2021-08-03 10:50:11 · 24749 阅读 · 0 评论 -
最短Hamilton路径(状态压缩DP)
题目给定一张n个点的带权无向图,点从0∼n−1 标号,求起点0到终点n−1 的最短 Hamilton 路径。Hamilton 路径的定义是从0到n−1 不重不漏地经过每个点恰好一次。输入格式第一行输入整数n。接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(记为 a[i,j])。对于任意的 x,y,z,数据保证a[x,x]=0,a[x,y]=a[y,x] 并且a[x,y]+a[y,z]≥a[x,z]。输出格式输出一...原创 2021-08-06 13:49:18 · 25181 阅读 · 2 评论 -
没有上司的舞会(树形DP)
题目Ural 大学有N名职员,编号为 1∼N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数Hi给出,其中1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行一个整数N。接下来N行,第i行表示i号职员的快乐指数Hi。接下来N−1 行,每行输入一对整数 L,K,...原创 2021-08-06 22:26:29 · 24622 阅读 · 1 评论 -
计数问题(数位统计DP)
题目给定两个整数a和b,求a和b之间的所有数字中0∼9的出现次数。例如,a=1024,b=1032,则a和b之间共有9个数如下:1024 1025 1026 1027 1028 1029 1030 1031 1032其中0出现10次,1出现10次,2出现7次,3出现3次等等…输入格式输入包含多组测试数据。每组测试数据占一行,包含两个整数a和b。当读入一行为0 0时,表示输入终止,且该行不作处理。输出格式每...原创 2021-08-05 16:12:08 · 24913 阅读 · 0 评论 -
01背包问题(dp)
题目有N件物品和一个容量是V的背包。每件物品只能使用一次。第i件物品的体积是vi,价值是wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有N行,每行两个整数vi,wi,用空格隔开,分别表示第i件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000<vi,wi≤1000输...原创 2021-07-29 12:48:13 · 24674 阅读 · 0 评论 -
最长上升子序列(线性DP)
题目给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000,−109≤数列中的数≤109输入样例:73 1 2 1 8 5 6输出样例:4代码#include<iostream>using namespace std;const int N = 1010;int a[N];//...原创 2021-07-30 13:50:20 · 24579 阅读 · 0 评论 -
最长上升子序列2(DP)
题目给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤100000,−109≤数列中的数≤109输入样例:73 1 2 1 8 5 6输出样例:4思路代码#include<iostream>using namespace std;const int N = 1e5 + 10;...原创 2021-07-30 20:30:33 · 24664 阅读 · 0 评论 -
完全背包问题(DP)
题目有N种物品和一个容量是V的背包,每种物品都有无限件可用。第i种物品的体积是vi,价值是wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有N行,每行两个整数 vi,wi,用空格隔开,分别表示第i种物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000<vi,wi≤1000...原创 2021-07-29 20:08:06 · 24604 阅读 · 0 评论 -
多重背包问题2(DP)
题目有N种物品和一个容量是V的背包。第ii种物品最多有si件,每件体积是vi,价值是wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有N行,每行三个整数 vi,wi,si 用空格隔开,分别表示第ii种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0<N≤10000<V≤20000&...原创 2021-07-29 21:37:44 · 24695 阅读 · 0 评论 -
多重背包问题1
题目有N种物品和一个容量是V的背包。第i 种物品最多有si件,每件体积是vi,价值是wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有N行,每行三个整数vi,wi,si,用空格隔开,分别表示第i种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤1000<vi,wi,si≤1...原创 2021-07-29 20:32:23 · 24614 阅读 · 0 评论 -
数字三角形(线性dp)
题目给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。 7 3 8 8 1 0 2 7 4 44 5 2 6 5输入格式第一行包含整数n,表示数字三角形的层数。接下来n行,每行包含若干整数,其中第i行表示数字三角形第i层包含的整数。输出格式输出一个整数,表示最大的路径数字和...原创 2021-07-30 10:56:06 · 24615 阅读 · 0 评论 -
分组背包问题
题目有N组物品和一个容量是V的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是vij,价值是wij,其中i是组号,j是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行有两个整数 N,V,用空格隔开,分别表示物品组数和背包容量。接下来有N组数据:每组数据第一行有一个整数Si,表示第i个物品组的物品数量; 每组数据接下来有Si行,每行有两个整数 vij,wij,用空...原创 2021-07-30 09:46:50 · 24597 阅读 · 0 评论