
DP
lajiyuan_
已经退役啦,会不定期更新cf博客 or 其他计算机知识相关的博客.
展开
-
【NCPC2017-2018-gym101572-A.Airport Coffee 】 线段树+分类讨论DP
Airport Coffee题目链接:https://codeforces.com/gym/101572/problem/ADescriptionInputOutputSample Input100000 100 138 60 30055000 20000 50000 55000 75000Sample Output20 3题意从000这个位置出发走到$ l这个位...原创 2019-09-27 22:14:12 · 373 阅读 · 0 评论 -
【牛客练习赛 41 B.666RPG】DP+滚动数组
B.666RPG题意有一个数字初值为0,n回合操作,每回合操作有两种,第一种操作将分数加上aia_iai,第二种操作是将分数乘上-1.问有多少种操作方式在第n回合之后数字变为-666而且中间每一个回合之后分数都不是666。1≤N≤3001 \leq N \leq 3001≤N≤300−666≤ai≤666-666 \leq a_i \leq 666−666≤ai≤666做法由于n...原创 2019-03-02 16:04:30 · 316 阅读 · 0 评论 -
【Educational Codeforces Round 60 (Rated for Div. 2) D. Magic Gems】 DP+矩阵快速幂
D. Magic Gems题意长度为n的01串0的个数是m的倍数,而且每m个0都是连续的方案数。1≤n≤10181 \leq n \leq 10^{18}1≤n≤10182≤m≤1002 \leq m \leq 1002≤m≤100做法可以看到n很大,我们首先想n很小的时候怎么做,我们用dp[i]表示长度为i的串的合法方案数,第i位放1的方案数为dp[i-1],第i位放0的方案数位d...原创 2019-02-19 16:37:11 · 209 阅读 · 0 评论 -
【 Educational Codeforces Round 58 (Rated for Div. 2) F. Trucks and Cities】 DP+单调队列优化
题目链接F. Trucks and Cities题意有n个城市在x轴上,有m辆卡车,每辆卡车有四个属性,分别是起始城市s,终止城市f,每公里消耗燃料燃料消耗c,和可加油次数r。每次加油卡车油量加满,卡车的油量为V,所有卡车初始油量都是满的。求能让所有卡车从起点到达终点的最小油量V。2<=n<=400,1<=m<=2500002&...原创 2019-01-15 01:20:25 · 399 阅读 · 0 评论 -
【Codeforces Round #531 (Div. 3) F. Elongated Matrix】状压DP
F. Elongated Matrix题意给你一个n行m列的矩阵,我们由第一行第一列出发,从上向下走完第一列,之后再从第二行第一列出发,重复这个过程直到所有的格子都走完,我们可以得到一个路径序列,定义k为序列中所有相邻两数值的差的绝对值的最小值,现在我们可以交换矩阵的每一行,问交换之后k最大是多少。1<=n<=161<=n<=161&...原创 2019-01-10 21:57:09 · 433 阅读 · 0 评论 -
【 Educational Codeforces Round 57 (Rated for Div. 2) D. Easy Problem】DP
D. Easy Problem题意给你一个长度为n的字符串,每个点有一个删除的代价,问让字符串中不存在子序列hard的最小删除代价。1&lt;=n&lt;=1051&lt;=n&lt;=10^51<=n<=105做法定义dp[i][0]为到i为止的序列中不存在h的最小代价dp[i][1]为到i为止的序列中不存在ha的最小代价dp[i][...原创 2018-12-29 21:19:34 · 448 阅读 · 0 评论 -
【51NOD 1084矩阵取数问题】DP
51NOD1084 矩阵取数问题题意就是给你一个n*m的矩阵,从左上角走到右下角(只能向右向下走),再从右下角走到左上角(只能向左向上走),第一次来到一个格子会获得这个格子的权值,问最终回到左上角的获得的最大总权值.做法就是将两条路径看作都是从原点出发的,然后设置dp[i][j][k][l]为第一条路径走到(i,j),第二条路径走到(k,l)时的最大权值和,转移也很清晰,四种转移方式,如果...原创 2018-12-09 10:16:28 · 226 阅读 · 0 评论 -
【Codeforces Round #515 (Div. 3) B. Heaters】dp
B. Heaters题意有n个格子,每个格子有01权值,1代表这个格子可以安装暖气,每个暖气可以温暖距离自己小于r的格子,问最少安装几个暖气能温暖n个格子。1&amp;lt;=n&amp;lt;=1031&amp;lt;=n&amp;lt;=10^31&lt;=n&lt;=103做法dp[i]表示最后一个暖气放在i能使前i个格子都温暖的最小暖气数转移就很明显,dp[i]=mindp[...原创 2018-12-04 00:13:33 · 169 阅读 · 0 评论 -
【51NOD1055 最长等差数列】DP+剪枝+Hash
51NOD1055 最长等差数列题意就是给你n个数,让你用n个数组成一个最长的等差序列。1&lt;=n&lt;=1041&lt;=n&lt;=10^41<=n<=104做法我们肯定要想O(n2)O(n^2)O(n2)的做法再加一些剪枝,首先将数组排序,之后我们设dp[i][j]dp[i][j]dp[i][j]表示以i为结尾的公差为j的最长等差序...原创 2018-12-06 01:27:48 · 187 阅读 · 0 评论 -
【Codeforces Round #526 (Div. 2) D. The Fair Nut and the Best Path】树形DP
D. The Fair Nut and the Best Path题意给你一棵树,在树中找出一条路径(也可以只有一个点),这条路径(点权和-边权和)最大。做法我们设dp[i]为以i为出发点向子树方向的最优路径,那么我们可以很轻松的用儿子的dp数组更新父亲的dp数组也就是取一个最大的dp[i]-w[v],w[v]表示父亲与这个儿子之间的路径权值我们有了dp数组,我们发现,对于某个点...原创 2018-12-12 22:30:57 · 183 阅读 · 0 评论 -
【Codeforces Round #544 (Div. 3) E. K Balanced Teams】DP
E. K Balanced Teams题意给你n个数,分成k组,要求每组内最大值与最小值的差值不超过5。求k组最多可以放多少个数。1≤n,k≤50001 \leq n,k \leq 50001≤n,k≤5000做法首先对数组排序,我们可以预处理每个数最多可以向左扩展的长度。之后我们用dp[i][j]dp[i][j]dp[i][j]表示前i个数分为j组最多可以放多少个数。对于每个i,...原创 2019-03-08 15:07:45 · 485 阅读 · 0 评论 -
【Educational Codeforces Round 61 (Rated for Div. 2) F. Clear the String】区间DP
F. Clear the String题意给你一个长度为nnn的字符串,每次可以把一个全是同一个字符的子串删除,求让字符串为空的最小删除次数。做法首先这道题删除之后长度变化就不好做了,我们把删除改成变划,可以把一段连续的字符换成另一个字符,这样是不影响答案的,因为这等价于删除,这样我们就可以dpdpdp了。设dp[i][j]dp[i][j]dp[i][j]为将str[i,j]变成同一...原创 2019-03-07 11:44:18 · 357 阅读 · 2 评论 -
【Educational Codeforces Round 61 (Rated for Div. 2) E. Knapsack】贪心+背包
E. Knapsack题意给你很多个物品,每个物品的重量为1,2,3,4,5,6,7,81,2,3,4,5,6,7,81,2,3,4,5,6,7,8,现在给出每个重量的物品的种数,问最后容量为W的背包最多装下多重的物品。1≤w≤10181 \leq w \leq 10^{18}1≤w≤10181≤cnti≤10161 \leq cnt_i \leq 10^{16}1≤cnti≤1016...原创 2019-03-07 11:46:45 · 642 阅读 · 0 评论 -
【Codeforces Round #564 (Div. 2) D. Nauuo and Circle】
Codeforces Round #564 (Div. 2) D. Nauuo and Circle题意给你一棵树,问把这棵树放在一个圆上,保证任意两边不相交,而且从任意一点顺时针绕圆周的下标序列不同就算不同的放法,求方案数。做法首先考虑树形dp,由于在圆周上,一个子树肯定是一段连续的区间,那么也就是对于以u为根的来说,他的几个儿子之间是可以随意交换位置的,而且保证不会相交,所以加上u指向...原创 2019-06-08 00:15:07 · 552 阅读 · 0 评论 -
【LightOJ-1104 Birthday Paradox】概率&期望DP
LightOJ-1104 Birthday Paradox题意经典的生日悖论问题,现在假设一年有n天,问一个生日聚会至少邀请多少人才能保证至少有两个人生日相同的概率不小于0.5。做法首先我们通过样例大胆猜对于每个n,答案应该很小。之后我们用dp的方法求即可。dp[i]表示到i个人出现两个人生日相同的概率,首先1-dp[i-1]表示i-1个人没出现两个人生日相同的概率,之后只要第i个人生...原创 2019-04-25 18:05:59 · 313 阅读 · 2 评论 -
【LightOJ-1079 Just another Robbery 】概率01背包
LightOJ-1079 Just another Robbery题意有n个银行,第i个银行有MiM_iMi元,抢劫第i个银行被逮捕的概率为pip_ipi,现在想知道被逮捕概率小于P的条件下,最多可以抢多少钱。做法首先这种dp,我们发现一个不能作为dp维度的实数要计算,就要把这个维度转换为dp值的定义,于是我们用dp[i][j]表示前i个银行抢劫j元不被逮捕的概率,dp的转移式很显然,...原创 2019-04-25 17:54:55 · 182 阅读 · 0 评论 -
【LightOJ-1038-Race to 1 Again 】概率&期望DP
LightOJ-1038-Race to 1 Again题意给你一个数字,每次这个数字会等概率地变成他的某个因子,问这个数字变为1的期望步数。做法期望DP的固定做法,从后往前DP,首先dp[1]=0,之后每个数字选中他每一个因子的概率相等,设数字x变为1的期望为dp[x],那么我们可以得到等式dp[x]=∑d∣xdp[d]+1dp[x]= \sum_{d|x} {dp[d]+1}dp[x...原创 2019-04-25 17:34:51 · 162 阅读 · 0 评论 -
【LightOJ 1030 Discovering Gold】概率&期望DP
LightOJ 1030 Discovering Gold题意从左到右有nnn个方格,每一块方格上有xix_ixi块黄金,最初站在第一块方格上,有一个666个面的均匀骰子,每一个面上的权值是1−61-61−6,每次掷骰子之后按照点数yyy跳到yyy步之后的方格,如果超出范围,则重新掷骰子,问到达第n个方格能得到的期望黄金数。做法从后往前求期望,设dp[i]为i点到达n能获得的期望黄金数...原创 2019-04-24 22:17:37 · 390 阅读 · 0 评论 -
【 Educational Codeforces Round 63 D. Beautiful Array】DP
D. Beautiful Array题意给你一个长度为n的数组和一个x,现在可以选择至多一段子区间,让这个区间同时乘以x,之后让整个数组的最大子段和最大。做法dp[i][0]表示以i为终点还没进入加倍区的最大子段和。dp[i][1]表示以i为终点在加倍区内的最大子段和。dp[i][2]表示以i为终点离开加倍区的最大子段和。转移就很显然,最后对所有dp值取max即可。代码#incl...原创 2019-04-23 11:51:09 · 227 阅读 · 5 评论 -
【LightOJ - 1265 Island of Survival 】概率&期望DP
LightOJ - 1265 Island of Survival 题意你现在进入一片森林,森林中有n只老虎m只鹿,森林中有几个法则。如果两个老虎相遇,两个老虎都会死亡如果一只老虎遇见一只鹿,鹿会被老虎吃掉如果两只鹿相遇,什么也不会发生如果你遇到一只老虎,你会被老虎吃掉如果你遇到一只鹿,你可以选择杀掉这个鹿或者放走这个鹿现在求你能活下来的概率。做法这道题有两个做法,但是不管...原创 2019-04-26 14:07:56 · 284 阅读 · 0 评论 -
【LightOJ - 1248 Dice (III)】概率&期望DP
LightOJ - 1248 Dice (III)题意给你一个n面的均匀的骰子,问期望摇多少次可以看到所有的面。做法首先我们设dp[i]为当前看到不同的i面,可以看到所有面的期望次数,很显然dp[n]=0之后我们可以根据概率得到转移方程dp[i]=(n−in∗(dp[i+1]+1))+in∗(dp[i]+1)dp[i]=(\frac{n-i}{n}*(dp[i+1]+1))+\frac...原创 2019-04-25 22:34:04 · 202 阅读 · 0 评论 -
【Codeforces Round #551 (Div. 2) D.Serval and Rooted Tree】树形DP
链接Codeforces Round #551 (Div. 2) D.Serval and Rooted Tree题意给你一棵树,每个点上有一个flag,如果flag=0,表示这个点的权值是所有子节点权值中的最小值。如果flag=1,表示这个点的权值是所有子节点权值中的最大值。如果一共有k个子节点,我们可以给每一个子节点安排一个1-k中的权值,但是每个权值只能使用一次,现在想知道根节点权值...原创 2019-04-15 20:18:55 · 315 阅读 · 0 评论 -
【Codeforces Round #517 B. Curiosity Has No Li】DP+记录路径
B. Curiosity Has No Limits题意题意就是给你一个A序列和一个B序列让你构造一个t序列,t序列满足ai=ti∣ti+1a_i=t_i|t_{i+1}ai=ti∣ti+1bi=tib_i=t_ibi=ti&ti+1t_{i+1}ti+1做法赛中自己没什么想法,于是就写了个dpdp[i][j]表示第i个位置放j是否合法,每次更新之后记录路径...原创 2018-11-27 02:12:39 · 142 阅读 · 0 评论 -
【Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2) D. Minimum path】dp+滚动数组
D. Minimum path题意给你一个字符矩阵,起点在左上角,每次可以向右或者向下走,可以改变这个字符矩阵中的k个字符,是这个路径构成的字符串字典序最小。做法由于可以改变k个字符,那么肯定是找到一条路径,前面至少有k项为a,后面按照字典序选择路径就可以。所以我们先用dp[i][j]表示从原点到(i,j)的路径中a最多有多少个。之后对所有dp[i][j]-(i+j-1)>=...原创 2018-11-27 02:11:04 · 135 阅读 · 0 评论 -
【Codeforces Round #523 (Div. 2) C. Multiplicity】 dp+预处理
C. Multiplicity题意给你一个n个数的数列,让你构造一个序列,保证每个位置的数字能整除这个位置的下标。问有多少个子序列满足这种做法。做法设dp[i]为长度为i的合法子序列的个数,子序列的前后顺序一定在原序列中是一样的,所以我们从左到右dp,对于当前数字的每个因子x,都可以dp[x]+=dp[x+1],因为如果当前数字能整除x,她一定可以放在所有长度为x-1的子序列的后面,但是...原创 2018-11-24 14:34:47 · 272 阅读 · 2 评论 -
【POJ 3666 Making the Grade】 DP
POJ3666 本题题意就是用最小代价将原序列变为单调不增或者单调不减序列, 由于单调不增和单调不减是对称的,我们先想一下单调不减的情况 这个题首先我们想一下比较暴力的转移方程 dp[i][j]=abs(j−w[j])+min(dp[i−1][k])−−(k<=j)dp[i][j]=abs(j−w[j])+min(dp[i−1][k])−−(k<=j)dp[i][j]=abs(...原创 2018-08-30 18:44:44 · 219 阅读 · 0 评论 -
【HDU 2859 Phalanx】Hash+DP
HDU2859 HDU2859 求最大对称子矩阵,对称是延对角线对称,由于本题给出的对角线不方便操作,我们将所有字符串逆置一下,就变成了好操作的对角线,然后我们对每一行每一列进行hash,dp的时候只要从左上角dp值一直减小到0,判断是否有len满足向上和向左的hash值相等。 HDU2859代码#include<stdio.h>#include<iostream...原创 2018-08-30 18:43:42 · 248 阅读 · 0 评论 -
【HDU 1078 FatMouse and Cheese】 DP+记忆化搜索
HDU1078 HDU1078 这个题我们可以看出每个点不管之前怎么走,之后能走的最大路径都是固定的,因为之前不管怎么走,只要走到了这个点,就说明没有走过比当前点权值大的点,所以我们可以记忆化搜索一下,就可以了。 HDU1078代码#include<stdio.h>#include<iostream>#include<algorithm>...原创 2018-08-30 18:42:41 · 165 阅读 · 0 评论 -
【POJ 1661 Help Jimmy】 DP
POJ1661 POJ1661题目链接 题意就是一个小人在最高的平台上选择向左或者向右走,每秒的行走速度和下降速度都是1,有一个最长的下降的距离,超过这个距离就会GG,求最小时间 由于小人只能选择从左侧下降或者从右侧下降,我们只要设置两个下降状态,然后按照高度排序从下向上一下就可以了 设置dp[0][i]为小人站在i块选择从左侧下降时的到达地面的最短时间dp[0][i]为小人站在i块选...原创 2018-08-30 18:41:32 · 133 阅读 · 0 评论 -
【HDU 1260】 捆绑DP
HDU1160 HDU1160经典的按照某个维度排序保证最优解一定是在这个顺序上的,然后再进行DP HDU1160代码 HDU1260 题意就是一个人单独买票有一个花费,和前一个人一起买票有另一种花费,求最少花费 经典的绑定DP,对于第i个人,可以选择和前一个人一起买,不和前一个人一起买 dp[i]=max(dp[i−1]+a[i],dp[i−2]+b[i])dp[i]=max(d...原创 2018-08-30 18:40:04 · 312 阅读 · 0 评论 -
【HDU 1074 Doing Homework】 状压DP
HDU1074 题意就是有n个科目要掌握,每种科目有一个开始时间和持续时间,求最少需要的时间 由于这个题n比较小,就是经典的状压DP,我们可以从小到大枚举所有状态,然后对每种状态保留能达到当前状态的最优解,再从小状态向大状态转移。由于这道题要输出保证字典序而且原题就是按照字典序给出的,所以我们可以倒着遍历,这样就保证了字典序。 HDU1074代码#include<stdio...原创 2018-08-30 18:39:05 · 217 阅读 · 0 评论 -
【HDU 1069 Monkey and Banana】 排序+DP
HDU1069 题意就是一个小猴子有n种不同的长方体,每种有无数个,小猴子想把长方体垒到最高,要求上面的长方体的下表面严格小于下面的长方体的上表面, 根据题意我们知道一个长方体最多有六种可利用状态,我们按照长度为第一关键字,宽度为第二关键字排序,这样就保证了合法的拜访状态一定是按照这个顺序进行的,我们就可以n^2枚举转移了。 这一类DP有一个特点,先排序保证最优状态一定是按照这个顺序进...原创 2018-08-30 18:37:51 · 192 阅读 · 0 评论 -
【HDU 1024 Max Sum Plus Plus】 DP+滚动数组优化
HDU1024 最大M子段和 HDU1024 不太明白这个问题这么难竟然这么多的AC,这个题卡了很久最后去找了题解。 首先说一下题意,是给一个长度为n的序列,要求从序列出m个不相交的子段,使他们的和最大 n&lt;=1000000 我们首先想一下最暴力的DP方案 dp[i][j]表示选取第j个数字的情况下,将前j个数字分成i组的最大子段和 所以可能的情况有两种 ①(x1,y1),(...原创 2018-08-30 18:35:59 · 194 阅读 · 0 评论 -
【HDU 2243 考研路茫茫——单词情结】 AC自动机+DP+矩阵快速幂
HDU2243 在做本题之前推荐做POJ2778 题解 POJ2778求的是用给定字符集构造出的长度为n的字符串中没出现过给定字符串的字符串有多少个 本题统计的是出现过的,那么我们只需要算出一共可能的种数,再算出长度为1-n可能的出现过给定字符串的字符串个数,相减就是答案。 首先,我们先计算一共可能的种数, 设f[i]=261+262+.....26if[i]=261+262+.......原创 2018-06-13 19:37:27 · 166 阅读 · 0 评论 -
【kuangbin带你飞基础DP专题】 简要题解
biubiubiu第一次尝试一天rush一套专题(由于这套简单一些),14个小时完成了,现在来补一下当时卡住的题或者比较有意思的题的题解。 按照AC人数写一下题解HDU1029 http://acm.hdu.edu.cn/showproblem.php?pid=1029 这个题是一个非常经典的裁判官问题,有o(n)时间o(1)空间的解法,原理是根据如果这个数列中存在一个出现次数超...原创 2018-08-30 02:13:02 · 1681 阅读 · 0 评论 -
【51NOD1009数字1的数量】 数位DP
51NOD1009数字1的数量 题意就是求1-n之内出现过多少个1,比如11出现两次,112出现两次。 直接分为两种数位dp, 当当前位为1时,后面进行无限制数位dp求方案数, 当前位不为1时,直接数位dp下一位, 这样就算出了每一位为1对前一位的贡献。前一位不断加上后面可能的贡献数就好了。 代码#include&lt;iostream&gt;#include&lt;cstdio...原创 2018-09-17 02:24:16 · 234 阅读 · 0 评论 -
【ACM-ICPC 2018 焦作赛区网络预赛 B.Mathematical Curse】 DP
B. Mathematical Curse 题意就是给你一串运算符和一个初始值,你要按顺序使用这些运算符与一个序列中的数进行运算,序列中数的个数大于运算符的个数,要按先后顺序使用这些数而运算符,当然也可以选择不用某个数,但最后一定要把所有运算符用光。 我们用dp[i][j]表示到达第i个位置是使用j个运算符所能达到的最大值,然后就可以n*m进行转移,但是这道题过程中会出现负数,如果一个负数进行...原创 2018-09-17 02:26:06 · 171 阅读 · 0 评论 -
【Codeforces Round #518 (Div. 2) [Thanks, Mail.Ru!] D. Array Without Local Maximums】DP+滚动数组优化
D. Array Without Local Maximums题意本来有一个n个数字的数组,数字大小从1到200本来有一个n个数字的数组,数字大小从1到200本来有一个n个数字的数组,数字大小从1到200现在有些数字看不清了,但是只记得原数组有一种性质现在有些数字看不清了,但是只记得原数组有一种性质现在有些数字看不清了,但是只记得原数组有一种性质a[2]&gt;=a[1]a[2]...原创 2018-11-17 17:28:52 · 248 阅读 · 0 评论 -
【Codeforces Round #521 (Div. 3) F2 - Pictures with Kittens (hard version)】DP+单调队列优化
F1. Pictures with Kittens题意给你n个点,每个点有个权值a[i],可以在n个点中选x个特殊点,要保证最后的序列中每连续k个点都至少有一个特殊点,问x个特殊点的权值和最大可以是多少1&lt;=k,x&lt;=n&lt;=2001&lt;=k,x&lt;=n&lt;=2001<=k,x<=n<=200做...原创 2018-11-20 22:17:06 · 203 阅读 · 0 评论 -
【 Codeforces Round #522 C. Playing Piano】 DP+记录路径
C. Playing Piano题意给你一个a数组,让你按照规则构造b数组规则如下如果ai&lt;ai+1a_i&lt;a_{i+1}ai<ai+1那么bi&lt;bi+1b_i&lt;b_{i+1}bi<bi+1如果ai&gt;ai+1a_i&gt;a_{i+1}ai>ai+1那么bi&gt;bi+1...原创 2018-11-20 22:00:37 · 232 阅读 · 0 评论