动态规划
动态规划题集和代码详解
逐梦er
ACM铜牌退役狗、机器学习炼丹师、懒癌晚期患者
展开
-
动态规划系列问题—从小白到大佬的入门、进阶之旅!!!
文章目录前言一.什么是动态规划二.动态规划术语三.简单递归问题四.经典背包问题五.线性DP5.1数字三角形5.2子序列问题(LIS、LCS)六.区间DP6.1原理6.2模板6.3实战6.3.1 石子合并问题6.3.2 其他区间DP问题(思路和代码详解)七.树形DP7.1原理7.2实战7.2.1 没有上司的舞会7.2.2 其他树形DP问题(思路和代码详解)八.数位DP8.1原理8.2实战8.2.1 数字游戏8.2.2 其他数位DP问题(思路和代码详解)九.状压DP9.1原理9.2位运算基础9.3实战9.3.1原创 2020-06-18 23:08:44 · 11711 阅读 · 26 评论 -
AcWing 1084. 数字游戏 II
题目描述由于科协里最近真的很流行数字游戏。某人又命名了一种取模数,这种数字必须满足各位数字之和 mod N 为 0。现在大家又要玩游戏了,指定一个整数闭区间 [a.b],问这个区间内有多少个取模数。输入格式输入包含多组测试数据,每组数据占一行。每组数据包含三个整数 a,b,N。输出格式对于每个测试数据输出一行结果,表示区间内各位数字和 mod N 为 0 的数的个数。数据范围1≤a,b≤231−1,1≤N<100输入样例:1 19 9输出样例:2解题原创 2020-06-18 21:09:43 · 2571 阅读 · 0 评论 -
AcWing1082. 数字游戏
题目描述科协里最近很流行数字游戏。某人命名了一种不降数,这种数字必须满足从左到右各位数字呈非下降关系,如 123,446。现在大家决定玩一个游戏,指定一个整数闭区间 [a,b],问这个区间内有多少个不降数。输入格式输入包含多组测试数据。每组数据占一行,包含两个整数 a 和 b。输出格式每行给出一组测试数据的答案,即 [a,b] 之间有多少不降数。数据范围1≤a≤b≤231−1输入样例:1 91 19输出样例:918解题思路树形DP:从最高位开始考虑:原创 2020-06-18 21:06:35 · 2488 阅读 · 0 评论 -
AcWing135.最大子序和(单调队列DP)
题目传送门输入一个长度为n的整数序列,从中找出一段长度不超过m的连续子序列,使得子序列中所有数的和最大。注意: 子序列的长度至少是1。输入格式第一行输入两个整数n,m。第二行输入n个数,代表长度为n的整数序列。同一行数之间用空格隔开。输出格式输出一个整数,代表该序列的最大子序和。数据范围1≤n,m≤300000输入样例:6 41 -3 5 1 -2 3输出样例:7题解:单调队列:维护一个合法的窗口, 使得窗口具有单调性, 分3个步骤:1.窗口是否合法:判断该窗口原创 2020-06-18 15:06:47 · 2574 阅读 · 0 评论 -
AcWing1087.修剪草坪(单调队列DP)
题目传送门在一年前赢得了小镇的最佳草坪比赛后,FJ 变得很懒,再也没有修剪过草坪。现在,新一轮的最佳草坪比赛又开始了,FJ 希望能够再次夺冠。然而,FJ 的草坪非常脏乱,因此,FJ 只能够让他的奶牛来完成这项工作。FJ 有 N 只排成一排的奶牛,编号为 1 到 N。每只奶牛的效率是不同的,奶牛 i 的效率为 Ei。编号相邻的奶牛们很熟悉,如果 FJ 安排超过 K 只编号连续的奶牛,那么这些奶牛就会罢工去开派对。因此,现在 FJ 需要你的帮助,找到最合理的安排方案并计算 FJ 可以得到的最大效率原创 2020-06-18 15:04:05 · 2621 阅读 · 0 评论 -
AcWing1090.绿色通道(单调队列DP)
题目传送门高二数学《绿色通道》总共有 nn 道题目要抄,编号 1,2,…,n,抄第 i 题要花 ai 分钟。小 Y 决定只用不超过 t 分钟抄这个,因此必然有空着的题。每道题要么不写,要么抄完,不能写一半。下标连续的一些空题称为一个空题段,它的长度就是所包含的题目数。这样应付自然会引起马老师的愤怒,最长的空题段越长,马老师越生气。现在,小 Y 想知道他在这 t 分钟内写哪些题,才能够尽量减轻马老师的怒火。由于小 Y 很聪明,你只要告诉他最长的空题段至少有多长就可以了,不需输出方案。输入格式原创 2020-06-18 15:01:49 · 2598 阅读 · 0 评论 -
AcWing1088.旅行问题(单调队列DP)
题目传送门John 打算驾驶一辆汽车周游一个环形公路。公路上总共有 n 个车站,每站都有若干升汽油(有的站可能油量为零),每升油可以让汽车行驶一千米。John 必须从某个车站出发,一直按顺时针(或逆时针)方向走遍所有的车站,并回到起点。在一开始的时候,汽车内油量为零,John 每到一个车站就把该站所有的油都带上(起点站亦是如此),行驶过程中不能出现没有油的情况。任务:判断以每个车站为起点能否按条件成功周游一周。输入格式第一行是一个整数 n,表示环形公路上的车站数;接下来 n 行,每行两个整数原创 2020-06-18 14:59:03 · 3484 阅读 · 0 评论 -
AcWing1089.烽火传递(单调队列DP)
题目传送门烽火台是重要的军事防御设施,一般建在交通要道或险要处。一旦有军情发生,则白天用浓烟,晚上有火光传递军情。在某两个城市之间有 n 座烽火台,每个烽火台发出信号都有一定的代价。为了使情报准确传递,在连续 m 个烽火台中至少要有一个发出信号。现在输入 n,m 和每个烽火台的代价,请计算在两城市之间准确传递情报所需花费的总代价最少为多少。输入格式第一行是两个整数 n,m,具体含义见题目描述;第二行 n 个整数表示每个烽火台的代价 ai。输出格式输出仅一个整数,表示最小代价。数据范围原创 2020-06-18 14:56:11 · 2622 阅读 · 0 评论 -
AcWing327.玉米田(状压DP)题解
Acwing.玉米田(状压DP)题目传送门题目描述农夫约翰的土地由M*N个小方格组成,现在他要在土地里种植玉米。非常遗憾,部分土地是不育的,无法种植。而且,相邻的土地不能同时种植玉米,也就是说种植玉米的所有方格之间都不会有公共边缘。现在给定土地的大小,请你求出共有多少种种植方法。土地上什么都不种也算一种方法。输入格式第1行包含两个整数M和N。第2…M+1行:每行包含N个整数0或1,用来描述整个土地的状况,1表示该块土地肥沃,0表示该块土地不育。输出格式输出总种植方法对10000000原创 2020-06-18 14:53:48 · 2513 阅读 · 0 评论 -
AcWing1064.骑士(状压DP)题解
Acwing.骑士(状压DP)题目传送门题目描述在 n×n 的棋盘上放 k 个国王,国王可攻击相邻的 8 个格子,求使它们无法互相攻击的方案总数。输入格式共一行,包含两个整数 n 和 k。输出格式共一行,表示方案总数,若不能够放置则输出00。数据范围1 ≤ n ≤ 100 ≤ k ≤ n^2输入样例:3 2输出样例:16题解:状态压缩DP:dp[ i ] [ j ] [ k ]表示第 i 行,状态为 j , 放国王的个数为k时的方案数其中j用二进制表示, 1表原创 2020-06-18 14:52:28 · 2826 阅读 · 0 评论 -
AcWing1081.度的数量(数位DP)题解
题目传送门求给定区间 [X, Y] 中满足下列条件的整数个数:这个数恰好等于 K 个互不相等的 B 的整数次幂之和。例如,设 X=15,Y=20,K=2,B=2X=15,Y=20,K=2,B=2,则有且仅有下列三个数满足题意:17=24+2017=24+2018=24+2118=24+2120=24+2220=24+22输入格式第一行包含两个整数 X 和 Y,接下来两行包含整数 K 和 B。输出格式只包含一个整数,表示满足条件的数的个数。数据范围1≤ X ≤ Y ≤2 ^31−11原创 2020-06-18 14:41:06 · 2746 阅读 · 0 评论 -
AcWing1085.不要62(数位DP)题解
题目传送门题目描述杭州人称那些傻乎乎粘嗒嗒的人为 6262(音:laoer)。杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。不吉利的数字为所有含有 4 或 62 的号码。例如:62315,73418,88914 都属于不吉利号码。但是,61152虽然含有 6 和 2,但不是 连号,所以不属于不吉利数字之列。你的任务是,对于每次给出的一个牌照号区间 [n,m],推断出交管局今后又要实原创 2020-06-18 14:39:11 · 2589 阅读 · 0 评论 -
AcWing1083. Windy数(数位DP)题解
题目传送门题目描述Windy 定义了一种 Windy 数:不含前导零且相邻两个数字之差至少为 2 的正整数被称为 Windy 数。Windy 想知道,在 A 和 B 之间,包括 A 和 B,总共有多少个 Windy 数?输入格式共一行,包含两个整数 A 和 B。输出格式输出一个整数,表示答案。数据范围1≤A≤B≤2×10^9输入样例1:1 10输入样例2:25 50题解:数位DP:跟之前的情况一样,分离每一位数,从高位开始枚举,因为不能存在前导0,所以可以让最高位原创 2020-06-18 14:37:59 · 2677 阅读 · 0 评论 -
AcWing323. 战略游戏(树形DP)题解
题目传送门题目描述鲍勃喜欢玩电脑游戏,特别是战略游戏,但有时他找不到解决问题的方法,这让他很伤心。现在他有以下问题。他必须保护一座中世纪城市,这条城市的道路构成了一棵树。每个节点上的士兵可以观察到所有和这个点相连的边。他必须在节点上放置最少数量的士兵,以便他们可以观察到所有的边。你能帮助他吗?例如,下面的树:只需要放置1名士兵(在节点1处),就可观察到所有的边。输入格式输入包含多组测试数据,每组测试数据用以描述一棵树。对于每组测试数据,第一行包含整数N,表示树的节点数目。接下来N原创 2020-06-18 14:31:53 · 2630 阅读 · 0 评论 -
AcWing1075. 数字转换(树形DP)题解
题目传送门如果一个数 x 的约数之和 y(不包括他本身)比他本身小,那么 x 可以变成 y,y 也可以变成 x。例如,4 可以变为 3,1 可以变为 7。限定所有数字变换在不超过 n 的正整数范围内进行,求不断进行数字变换且不出现重复数字的最多变换步数。输入格式输入一个正整数 n。输出格式输出不断进行数字变换且不出现重复数字的最多变换步数。数据范围1≤n≤50000输入样例:7输出样例:3样例解释一种方案为:4→3→1→7。题解:树形DP:首先预处理出每个数的原创 2020-06-18 14:30:09 · 2603 阅读 · 0 评论 -
AcWing1072. 树的最长路径(树形DP)题解
题目传送门题目描述给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。现在请你找到树中的一条最长路径。换句话说,要找到一条路径,使得使得路径两端的点的距离最远。注意:路径中可以只包含一个点。输入格式第一行包含整数 n。接下来 n−1 行,每行包含三个整数 ai,bi,ci,表示点 ai 和 bi 之间存在一条权值为 ci 的边。输出格式输出一个整数,表示树的最长路径的长度。数据范围1≤n≤100001≤ai,bi≤n−105≤ci≤105原创 2020-06-18 14:28:58 · 2792 阅读 · 0 评论 -
AcWing1073.树的中心(树形DP)题解
题目传送门题目描述给定一棵树,树中包含 n 个结点(编号1~n)和 n−1 条无向边,每条边都有一个权值。请你在树中找到一个点,使得该点到树中其他结点的最远距离最近。输入格式第一行包含整数 n。接下来 n−1 行,每行包含三个整数 ai,bi,ci,表示点 ai 和 bi 之间存在一条权值为 ci 的边。输出格式输出一个整数,表示所求点到树中其他结点的最远距离。数据范围1≤n≤100001≤ai,bi≤n−105≤ci≤105输入样例:52 1 13 2 14 3 1原创 2020-06-18 14:27:54 · 2706 阅读 · 0 评论 -
AcWing285. 没有上司的舞会(树形DP)题解
题目传送门题目描述Ural大学有N名职员,编号为1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 HiHi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行一个整数N。接下来N行,第 i 行表示 i 号职员的快乐指数Hi。接下来N-1行,每行输入一对整数L, K,表示K是L的原创 2020-06-18 14:25:40 · 2789 阅读 · 0 评论 -
AcWing1077. 皇宫看守(树形DP)题解
题目传送门题目描述太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫。皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状,某些宫殿间可以互相望见。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少。输入格式输入中数据描述一棵树,描述如下:第一行 n,表示树中结点的数目。第二行至第 n+1 行,每行描述每个宫殿结原创 2020-06-18 14:22:50 · 3059 阅读 · 0 评论 -
AcWing1074. 二叉苹果树(树形DP)题解
题目传送门题目描述有一棵二叉苹果树,如果树枝有分叉,一定是分两叉,即没有只有一个儿子的节点。这棵树共 N 个节点,编号为 1 至 N,树根编号一定为 1。我们用一根树枝两端连接的节点编号描述一根树枝的位置。一棵苹果树的树枝太多了,需要剪枝。但是一些树枝上长有苹果,给定需要保留的树枝数量,求最多能留住多少苹果。这里的保留是指最终与1号点连通。输入格式第一行包含两个整数 N 和 Q,分别表示树的节点数以及要保留的树枝数量。接下来 N−1 行描述树枝信息,每行三个整数,前两个是它连接的节点的编号原创 2020-06-18 14:20:44 · 2802 阅读 · 1 评论 -
AcWing1069.凸多边形的划分(区间DP)题解
凸多边形的划分题目传送门题目描述给定一个具有 N 个顶点的凸多边形,将顶点从 1 至 N 标号,每个顶点的权值都是一个正整数。将这个凸多边形划分成 N−2 个互不相交的三角形,对于每个三角形,其三个顶点的权值相乘都可得到一个权值乘积,试求所有三角形的顶点权值乘积之和至少为多少。输入格式第一行包含整数 N,表示顶点数量。第二行包含 N 个整数,依次为顶点 1 至顶点 N 的权值。输出格式输出仅一行,为所有三角形的顶点权值乘积之和的最小值。数据范围N≤50数据保证所有顶点的权值都小于1原创 2020-06-07 23:15:20 · 3584 阅读 · 0 评论 -
AcWing.282石子合并(区间DP)题解
石子合并题目描述设有N堆石子排成一排,其编号为1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有4堆石子分别为 1 3 5 2, 我们可以先合并1、2堆,代价为4,得到4 5 2, 又合并 1,2堆,代价为9,得到9 2 ,再合并得到11,总代价为4+9+11=24;如果第二步是先合并2,3堆,则代原创 2020-06-07 23:13:58 · 2720 阅读 · 0 评论 -
AcWing321.棋盘分割(区间DP)题解
棋盘分割题目传送门题目描述将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行)原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。均方差 ,其中平均值 ,xi为第 i 块矩形棋盘的总分。请编程对给出的棋盘及n,求出均方差的最小值。输入格式第1行为原创 2020-06-07 23:12:08 · 2586 阅读 · 0 评论 -
AcWing479.加分二叉树(区间DP)题解
加分二叉树题目传送门题目描述设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号。每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一个加分,任一棵子树subtree(也包含tree本身)的加分计算方法如下:subtree的左子树的加分 × subtree的右子树的加分 + subtree的根的分数若某个子树为空,规定其加分为1。叶子的加分就是叶节点本身的分数,不考虑它的空子树。试求一棵符合中序遍历为(1,原创 2020-06-07 23:01:47 · 2708 阅读 · 0 评论 -
区间DP之环形石子合并
环形石子合并题目传送门题目描述将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分。请编写一个程序,读入堆数 n 及每堆的石子数,并进行如下计算:选择一种合并石子的方案,使得做 n−1 次合并得分总和最大。选择一种合并石子的方案,使得做 n−1 次合并得分总和最小。输入格式第一行包含整数 n,表示共有 n 堆石子。第二行包含 n 个整数,分别表示每堆石子的数量。输出格式输出共两行:第一行为合并得原创 2020-06-06 23:36:16 · 3356 阅读 · 1 评论 -
动态规划之字符串最短编辑距离
题目描述给定两个字符串A和B,现在要将A经过若干操作变为B,可进行的操作有:删除–将字符串A中的某个字符删除。插入–在字符串A的某个位置插入某个字符。替换–将字符串A中的某个字符替换为另一个字符。现在请你求出,将A变为B至少需要进行多少次操作。输入格式第一行包含整数n,表示字符串A的长度。第二行包含一个长度为n的字符串A。第三行包含整数m,表示字符串B的长度。第四行包含一个长度为m的字符串B。字符串中均只包含小写字母。输出格式输出一个整数,表示最少操作次数原创 2020-06-06 23:33:02 · 2836 阅读 · 1 评论 -
动态规划之子序列问题
一.最长递增子序列I题目描述给定一个长度为N的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数N。第二行包含N个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000,−109≤数列中的数≤109输入样例:73 1 2 1 8 5 6输出样例:4思路:采用动态规划的思想,用dp[ i ]来表示序列中第i个元素结尾的最长上升子序列的长度那么状态转移方程为:if (a[i] > a[j]) dp[i] = MAX原创 2020-06-06 23:31:35 · 4154 阅读 · 1 评论 -
动态规划之回文串问题
一.DP求回文串[POJ-1159]A palindrome is a symmetrical string, that is, a string read identically from left to right as well as from right to left. You are to write a program which, given a string, determines the minimal number of characters to be inserted into原创 2020-06-06 23:30:11 · 2554 阅读 · 1 评论 -
背包九讲问题——超详细
Acwing背包题库一.01背包问题问题描述有 N 件物品和一个容量是 VV 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤100原创 2020-06-06 23:27:54 · 7879 阅读 · 19 评论