dp
文章平均质量分 64
1
zzqwtc
blog dot zzqwtc dot com
展开
-
Codeforces Round #750 (Div. 2) - E. Pchelyonok and Segments (dp)
E. Pchelyonok and Segments题意给你一个数组,找到 k 个不重叠的子段,第一段 [l1,r1l_1,r_1l1,r1] 的长度为 k,第二段 [l2,r2l_2,r_2l2,r2] 的长度为 k - 1 … 第 k 段[lk,rkl_k,r_klk,rk] 的长度为 1,其中 ri−1<lir_{i - 1} <l_iri−1<li,这些子段满足 sum(l1,r1)<sum(l2,r2)<......sum(lk,rk)sum(l_原创 2021-10-26 22:39:39 · 3321 阅读 · 0 评论 -
A. run --- 牛客2018多校 (dp)
A. run — 牛客2018多校题意白云每秒可以走 1步 或跑 k 步,但是不能连续跑 2 次及以上,q个询问,从 l - r 可能有多少种到达的方案,思路dp[i][j] i∈[1,100000],j∈{0,1}i \in [1,100000], j \in \{0,1\}i∈[1,100000],j∈{0,1} 表示到第 iii 米的最后一步是走的 (0) 还是跑的 (1)的所有方案数。那么转移方程为dp[i][0] = dp[i - 1][0] + dp[i - 1][1] 表示如原创 2021-10-02 18:57:28 · 3410 阅读 · 0 评论 -
D-牛牛种小树_牛客练习赛89(完全背包)
D-牛牛种小树_牛客练习赛89 (nowcoder.com)题目描述牛牛最近在学数据结构。他打算用他得到的米粒去构造一棵有n个节点的树, 并使得它的价值最大。 设f(d)表示树上度数为d的一个点能够获取的最大价值。则这棵树的价值为 ∑i=1nf(di)\sum_{i=1}^{n} f\left(d_{i}\right)∑i=1nf(di), 其中 did_{i}di 表示第i个点的度数。数据范围1<n⩽1e4,1⩽f(i)⩽1e91<n⩽1e4 , 1⩽f(i)⩽1e91<原创 2021-09-27 16:27:36 · 3418 阅读 · 0 评论 -
P3985 不开心的金明 - 洛谷 (01背包变形)
P3985 不开心的金明 - 洛谷题意金明今天很不开心,家里购置的二手房就要领钥匙了,房里并没有一间他自己专用的很宽敞的房间。更让他不高兴的是,妈妈昨天对他说:“你需要购买哪些物品,怎么布置,你说了不算(有很大的限制),而且不超过 W 元钱。”。今天一早金明就开始做预算,但是他想买的东西太多了,肯定会超过妈妈限定的 W 元。于是,他把每件物品规定了一个重要度整数 pip_ipi 表示。他还从因特网上查到了每件物品的价格 viv_ivi(都是整数元)。妈妈看到购物单后进行了审查,要求购物单上所有的物原创 2021-09-11 19:40:56 · 3502 阅读 · 0 评论 -
奇怪的汉诺塔
96. 奇怪的汉诺塔 - AcWing题库题意汉诺塔问题,条件如下:1、这里有 A、B、C 和 D 四座塔。2、这里有 n 个圆盘,n 的数量是恒定的。3、每个圆盘的尺寸都不相同。4、所有的圆盘在开始时都堆叠在塔 A 上,且圆盘尺寸从塔顶到塔底逐渐增大。5、我们需要将所有的圆盘都从塔 A 转移到塔 D 上。6、每次可以移动一个圆盘,当塔为空塔或者塔顶圆盘尺寸大于被移动圆盘时,可将圆盘移至这座塔上。请你求出将所有圆盘从塔 A 移动到塔 D,所需的最小移动次数是多少。汉诺塔参考模型思路原创 2021-08-30 23:52:41 · 3364 阅读 · 0 评论 -
Sequence Game
B-Sequence Game_牛客IOI周赛28-普及组 题意由于你帮助 Alice 回答得非常好,Sept 又找到了 Bob,希望能难倒他。他给了要求 Bob 组成一个长度为 n 的新的数列 a,其中数列 a 的每一个元素 aia_iai 都有 k 个取值。求所有可能的数列 a 中的最长上升子序列的的最大长度。由于 Sept 怕题目钛难,所以他答应 Bob,对于每个 i,k 个取值不降。思路这题 n 的范围为 1e3,k 的范围为 5e3,aia_iai 最大为1e3明显是一个 n2原创 2021-08-30 23:18:07 · 3851 阅读 · 0 评论 -
Acwing 1068 环形石子合并
环形石子合并题意将 n 堆石子绕圆形操场排放,现要将石子有序地合并成一堆。规定每次只能选相邻的两堆合并成新的一堆,并将新的一堆的石子数记做该次合并的得分。请编写一个程序,读入堆数 n 及每堆的石子数,并进行如下计算:选择一种合并石子的方案,使得做 n−1 次合并得分总和最大。选择一种合并石子的方案,使得做 n−1 次合并得分总和最小。思路将 n 堆石子按下列方式摆放:1 2 3 … n-1 n 1 2 3 … n-1 n将一般的石子合并扩展为长度为 2n 的石子合并 最后求最值的时候原创 2021-04-27 21:08:53 · 3327 阅读 · 0 评论 -
AcWIng 734. 能量石(贪心 + 01背包)
能量石题意岩石怪物杜达生活在魔法森林中,他在午餐时收集了 N 块能量石准备开吃。由于他的嘴很小,所以一次只能吃一块能量石。能量石很硬,吃完需要花不少时间。吃完第 i 块能量石需要花费的时间为 Si 秒。杜达靠吃能量石来获取能量。不同的能量石包含的能量可能不同。此外,能量石会随着时间流逝逐渐失去能量。第 i 块能量石最初包含 Ei 单位的能量,并且每秒将失去 Li 单位的能量。当杜达开始吃一块能量石时,他就会立即获得该能量石所含的全部能量(无论实际吃完该石头需要多少时间)。能量石中包含.原创 2021-04-25 22:48:05 · 3361 阅读 · 0 评论 -
AcWing 11. 背包问题求方案数(01背包计数)
背包问题求方案数题意有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出 最优选法的方案数。注意答案可能很大,请输出答案模 109+7 的结果。思路问题背景时 01背包问题 所以求价值的最大值可以直接用 01背包的思路求解:f[j]=max(f[j],f[j−w[i]]+v[i])f[j] = max(f[j],f[j - w[i]] + v[i])f[j]=m原创 2021-04-25 21:48:37 · 3711 阅读 · 0 评论 -
AcWing 10. 有依赖的背包问题
题意有 N 个物品和一个容量是 V 的背包。物品之间具有依赖关系,且依赖关系组成一棵树的形状。如果选择一个物品,则必须选择它的父节点。如下图所示:如果选择物品5,则必须选择物品1和2。这是因为2是5的父节点,1是2的父节点。每件物品的编号是 i,体积是 vi,价值是 wi,依赖的父节点编号是 pi。物品的下标范围是 1…N。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。思路有依赖的背包问题状态表示:f[i][j]f[i][j]f[i][j] 表示 以原创 2021-04-10 20:56:34 · 3433 阅读 · 0 评论 -
AcWing 274. 移动服务 (线性DP)
题意一个公司有三个移动服务员,最初分别在位置 1,2,3处。如果某个位置(用一个整数表示)有一个请求,那么公司必须指派某名员工赶到那个地方去。某一时刻只有一个员工能移动,且不允许在同样的位置出现两个员工。从 p 到 q 移动一个员工,需要花费 c(p,q)。这个函数不一定对称,但保证 c(p,p)=0。给出 N 个请求,请求发生的位置分别为 p1∼pN。公司必须按顺序依次满足所有请求,且过程中不能去其他额外的位置,目标是最小化公司花费,请你帮忙计算这个最小花费。思路线性dp:状态表示:f原创 2021-04-10 19:51:59 · 3319 阅读 · 0 评论 -
AcWing 532. 货币系统 (完全背包求方案数 变形)
题意在网友的国度中共有 n 种不同面额的货币,第 i 种货币的面额为 a[i],你可以假设每一种货币都有无穷多张。为了方便,我们把货币种数为 n、面额数组为 a[1…n]的货币系统记作 (n,a)。在一个完善的货币系统中,每一个非负整数的金额 x 都应该可以被表示出,即对每一个非负整数 x,都存在 n 个非负整数 t[i] 满足 a[i]×t[i] 的和为 x。然而,在网友的国度中,货币系统可能是不完善的,即可能存在金额 x 不能被该货币系统表示出。例如在货币系统 n=3, a=[2,5,9] 中原创 2021-04-08 14:35:53 · 3382 阅读 · 0 评论 -
完全背包原理
完全背包每件物品有无限多个朴素算法f[i][j]=max(f[i][j],f[i−1][j−k∗v[i]]+k∗w[i])f[i][j] = max(f[i][j], f[i - 1][j - k * v[i]] + k * w[i])f[i][j]=max(f[i][j],f[i−1][j−k∗v[i]]+k∗w[i])与01背包类似for (int i = 1;i <= n;++i) { for (int j = 0;j <= m;++j) { for (int k = 0;v原创 2021-04-07 13:27:49 · 3311 阅读 · 0 评论 -
AcWing 487. 金明的预算方案 (有依赖关系的背包问题)
题意金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过N元钱就行”。今天一早,金明就开始做预算了,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zD5H6hSm-1617371885579)(Untitled.assets/19_45c6dcea44-QQ截原创 2021-04-02 21:59:27 · 3372 阅读 · 0 评论 -
AcWing 1013. 机器分配 (分组背包)
1013. 机器分配题意总公司拥有MMM台 相同 的高效设备,准备分给下属的NNN个分公司。各分公司若获得这些设备,可以为国家提供一定的盈利。盈利与分配的设备数量有关。问:如何分配这M台设备才能使国家得到的盈利最大?求出最大盈利值。分配原则:每个公司有权获得任意数目的设备,但总台数不超过设备数MMM。思路分组背包裸题状态表示:f[i][j]f[i][j]f[i][j] 表示分配到前 iii 个公司 已经分配了 jjj 台机器的利润最大值状态计算:设 kkk 表示给当前公司分配 kkk原创 2021-04-02 19:27:58 · 3418 阅读 · 0 评论 -
背包问题求具体方案
先从后往前求背包问题 然后从前往后求具体方案因为是求字典序最小的方案 那么 如果当前的物品能选就一定要选#include<bits/stdc++.h>using namespace std;const int N = 1010;int n,m;int v[N],w[N];int f[N][N];int main(){ cin >> n >> m; for(int i = 1;i <= n;++i)cin >>原创 2021-03-29 21:27:17 · 3251 阅读 · 0 评论 -
AcWing 1025. 开餐馆 (线性dp)
1025. 开餐馆题意信息学院的同学小明毕业之后打算创业开餐馆.现在共有 nnn 个地点可供选择。小明打算从中选择合适的位置开设一些餐馆。这 nnn 个地点排列在同一条直线上。我们用一个整数序列 m1,m2,…,mnm_1,m_2,…,m_nm1,m2,…,mn来表示他们的相对位置。由于地段关系,开餐馆的利润会有所不同。我们用 pip_ipi 表示在 mim_imi 处开餐馆的利润。为了避免自己的餐馆的内部竞争,餐馆之间的距离必须大于 kkk。请你帮助小明选择一个总利润最大的方案。原创 2021-03-24 10:26:34 · 3544 阅读 · 0 评论 -
AcWing 272. 最长上升公共子序列 (LIS + LCS)
272. 最长公共上升子序列题意熊大妈的奶牛在小沐沐的熏陶下开始研究信息题目。小沐沐先让奶牛研究了最长上升子序列,再让他们研究了最长公共子序列,现在又让他们研究最长公共上升子序列了。小沐沐说,对于两个数列 A 和 B,如果它们都包含一段位置不一定连续的数,且数值是严格递增的,那么称这一段数是两个数列的公共上升子序列,而所有的公共上升子序列中最长的就是最长公共上升子序列了。奶牛半懂不懂,小沐沐要你来告诉奶牛什么是最长公共上升子序列。不过,只要告诉奶牛它的长度就可以了。数列 A 和 B 的长度均不原创 2021-03-20 16:14:46 · 3250 阅读 · 0 评论 -
DP中用到的定理
Dilworth定理把一个数列划分成最少的最长不升子序列的数目就等于这个数列的最长上升子序列的长度参考题目 AcWing 1010. 拦截导弹原创 2021-03-17 10:56:31 · 3239 阅读 · 0 评论 -
AcWing 187. 导弹防御系统 (LIS + dfs)
187. 导弹防御系统题意为了对抗附近恶意国家的威胁,RR 国更新了他们的导弹防御系统。一套防御系统的导弹拦截高度要么一直 严格单调 上升要么一直 严格单调 下降。例如,一套系统先后拦截了高度为 3 和高度为 4 的两发导弹,那么接下来该系统就只能拦截高度大于 4 的导弹。给定即将袭来的一系列导弹的高度,请你求出至少需要多少套防御系统,就可以将它们全部击落。思路和 AcWing 1010. 拦截导弹 很类似的一题 唯一不同的是不仅可以选择上升子序列 也可以选择下降子序列因为数据非常的小 所以原创 2021-03-16 10:54:06 · 3499 阅读 · 0 评论 -
AcWing 1010. 拦截导弹 (LIS + 贪心)
1010. 拦截导弹题意某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。思路第一小问是裸的最长上升原创 2021-03-15 20:43:01 · 3336 阅读 · 0 评论 -
AcWing 1012. 友好城市(排序 + dp)
1012. 友好城市题意PalmiaPalmiaPalmia 国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。思路对于北岸的城市若想满足题目要求 必须要满足左边城市对应的南岸城原创 2021-03-14 19:32:30 · 3263 阅读 · 0 评论 -
LIS (最长递增子序列) 朴素版
时间复杂度 :O(n2)O(n^2)O(n2)dp[i]dp[i]dp[i] 表示 以第 iii 个数字结尾的上升子序列的最大长度#include<bits/stdc++.h>#define INF 0x3f3f3f3f#define mod 998244353#define endl '\n'using namespace std;typedef long long LL;typedef pair<int, int>PII;const int N = 1010;原创 2021-03-14 15:40:51 · 3206 阅读 · 0 评论 -
AcWing 1027. 方格取数 (线性dp + 数字三角形模型)
1027. 方格取数题意设有 N×NN×NN×N 的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示:某人从图中的左上角 A 出发,可以向下行走,也可以向右行走,直到到达右下角的 B 点。在走过的路上,他可以取走方格中的数(取走后的方格中将变为数字0)。此人从 A 点到 B 点共走了两次,试找出两条这样的路径,使得取得的数字和为最大。思路dpdpdp 问题最初想法 设 dp[i1][j1][i2][j2]dp[i1][j1][i2][j2]dp[i1][j1原创 2021-03-14 15:05:14 · 3263 阅读 · 0 评论 -
CodeForces - 1459D - Glass Half Spilled
Glass Half Spilled题意在编号为 111 的桌子上有 nnn 个玻璃杯,第 iii 个杯子可以容纳最多 aia_iai 单位水,当前包含 bib_ibi 单位水。选择 kkk 个玻璃杯,并尽可能多地收集水。为了达到这个效果,你可以把水从一个玻璃杯倒到另一个玻璃杯,想倒多少次就倒多少次 然而,每次你试图转移任何数量的水时,都会有一半的水洒在地板上。对于每个 k=1、2、3、…nk=1、2、3、\dots nk=1、2、3、…n,确定在零次或多次在玻璃杯之间转移水后,任意选择的k个玻璃原创 2021-01-30 16:50:08 · 3039 阅读 · 0 评论 -
树形dp原理
树形DP没有上司的舞会状态表示f[u][0]f[u][0]f[u][0] : 所有从以u为根的子树中选择,并且不选择这个点的方案f[u][1]f[u][1]f[u][1]: 所有从以u为根的子树中选择,并且选择这个点的方案状态计算uuu为当前节点 jjj为子节点f[u][0]f[u][0]f[u][0]:不选当前节点 f[u][0]=∑max(f[j][0],f[j][1])f[u][0] = ∑max(f[j][0],f[j][1])f[u][0]=∑max(f[j][0],f[j][1原创 2021-01-25 00:09:05 · 2346 阅读 · 0 评论 -
状压dp原理
状压DP蒙德里安的梦想求把N∗MN*MN∗M的棋盘分割成若干个1*2的的长方形,有多少种方案。先考虑横着放的情况 竖着放的自然唯一确定状态表示f[i][j]f[i][j]f[i][j]表示第iii列的每一行小方格被占用的情况 jjj为二进制数 111表示占用状态计算用jjj表示iii列的状态 kkk表示i−1i - 1i−1列的状态能从i−1i-1i−1列转移到iii列的条件① 两列没有冲突的情况 j&k==0j \& k == 0j&k==0②第i−1i-原创 2021-01-25 00:08:30 · 2269 阅读 · 0 评论 -
数位dp
数位统计DP给定两个整数 a 和 b,求 a 和 b 之间的所有数字中0 ~ 9的出现次数。假设n=abcdefgn = abcdefgn=abcdefg 计算ddd位上xxx出现的次数 resresres记录答案1、(001——abc−1)(001——abc-1)(001——abc−1) xxx (000——999)(000——999)(000——999) res+=abc∗1000res += abc * 1000res+=abc∗10002、abcabcabc xxx 2.1、d&l原创 2021-01-25 00:07:49 · 2191 阅读 · 0 评论 -
计数dp原理
计数DP整数划分一个正整数nnn可以表示成若干个正整数之和 我们将这样的一种表示称为正整数n的一种划分。现在给定一个正整数n,请你求出n共有多少种不同的划分方法。完全背包写法状态表示类似完全背包 1~i1~i1~i分为iii个物品 每个物品的体积为iii 并且不限制数量 求总体积为jjj的方案数f[i][j]f[i][j]f[i][j]表示从1~i1~i1~i选总体积恰好为jjj的数量状态计算f[i][j]=f[i−1][j]+f[i−1][j−i]+f[i−1][j−i∗2]+⋯+f[i原创 2021-01-25 00:07:24 · 2321 阅读 · 4 评论 -
区间dp原理
区间DP石子合并设有N堆石子排成一排,其编号为1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。问题是:找出一种合理的方法,使总的代价最小,输出最小代价。状态表示f[i][j]f[i][j]f[i][j]所有将第iii堆石子到第jjj堆石子合并成一堆石子的合并方式状态计算f[l][r]=Min(f[原创 2021-01-25 00:06:48 · 2142 阅读 · 0 评论 -
线性dp原理
线性DP数字三角形给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。 7 3 8 8 1 0 2 7 4 44 5 2 6 5状态表示f[i][j]f[i][j]f[i][j] : 所有从起点走到(i,j)(i,j)(i,j)的路径最大值状态计算f[i][j]=Max(f[i−1][j−1],f[i−1原创 2021-01-24 22:59:12 · 2135 阅读 · 0 评论 -
分组背包原理
分组背包类似多重背包,只是将每件物品选几个变成每组物品选哪一个状态转移方程f[i][j]=Max(f[i−1][j],f[i−1][j−v[i][k]]+w[i][k])f[i][j] = Max(f[i-1][j],f[i-1][j-v[i][k]] + w[i][k])f[i][j]=Max(f[i−1][j],f[i−1][j−v[i][k]]+w[i][k])所以优化成一维时需要从大到小枚举jjjint n, m;int f[N];int v[N][N], w[N][N], s[N];原创 2021-01-24 22:56:10 · 2116 阅读 · 0 评论 -
多重背包原理
多重背包每件物品的个数有限制朴素算法与完全背包的朴素算法类似 时间复杂度O(N∗V∗S)O(N*V*S)O(N∗V∗S)状态转移方程f[i][j]=max(f[i][j],f[i−1][j−k∗v[i]]+k∗w[i])f[i][j] = max(f[i][j], f[i - 1][j - k * v[i]] + k * w[i])f[i][j]=max(f[i][j],f[i−1][j−k∗v[i]]+k∗w[i])优化成一维时需要从大到小枚举jjjfor (int i = 1;i <=原创 2021-01-24 22:55:34 · 2128 阅读 · 0 评论 -
01背包原理
01背包每件物品只有一个朴素算法分为两种情况:①不选第i个物品f[i−1][j]f[i-1][j]f[i−1][j] ②选第i个物品 状态方程可以由f[i−1][j−v]+wf[i-1][j-v] + wf[i−1][j−v]+w得到f[i−1][j−v]+wf[i-1][j-v] + wf[i−1][j−v]+w表示前i−1i - 1i−1个物品取总体积不超过j−vj - vj−v的最大价值加上第iii个物品的价值(v,wv,wv,w)分别表示第iii个物品的体积和价值for (原创 2021-01-24 22:54:38 · 2300 阅读 · 2 评论 -
AcWing1252. 搭配购买 (并查集+01背包)
AcWing1252. 搭配购买思路先分组 再做01背包Joe觉得云朵很美,决定去山上的商店买一些云朵。商店里有 n 朵云,云朵被编号为 1,2,…,n,并且每朵云都有一个价值。但是商店老板跟他说,一些云朵要搭配来买才好,所以买一朵云则与这朵云有搭配的云都要买。但是Joe的钱有限,所以他希望买的价值越多越好。输入格式第 1 行包含三个整数 n,m,w表示有 n 朵云,m 个搭配,Joe有 w 的钱。第 2∼n+1行,每行两个整数cic_{i}ci,did_{i}di 表示 i 朵云的原创 2021-01-24 22:50:23 · 2135 阅读 · 0 评论 -
LIS(最长递增子序列) 二分 + dp
算法:动态规划+二分查找时间复杂度:O(nlogn)#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<map>#include<cstdio>#define INF 0x3f3f3f3f#define m...原创 2020-03-31 14:39:49 · 1743 阅读 · 0 评论 -
LCS(最长公共子序列)
给出两个字符串 求其最长公共子序列#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<map>#include<cstdio>#define INF 0x3f3f3f3f#define mod 1000000...原创 2020-03-31 13:53:47 · 1683 阅读 · 0 评论