
动态规划
文章平均质量分 61
TeJoy
这个作者很懒,什么都没留下…
展开
-
cf1430F(dp/贪心好题)
cf1430F(dp/贪心好题)题意:现在有n波怪物,每波怪物起讫时间为l[i]~r[i],有a[i]只怪物,你现在有一把枪,弹夹容量为k,你开枪不用时间,一枪一个小朋友。但是换弹夹需要1s,并且换弹夹的时候,如果弹夹里有子弹,会将子弹扔掉再塞满。你需要在每波怪物的时间限制内将其杀光,并且花费的子弹数最少(包括扔掉的子弹),问你最少需要花费多少子弹。**方法一:dp **显然是求最少扔掉的子弹。我们考虑,在中间扔掉一定是不优的,需要扔掉的情况只有当后面一轮做不完的时候才扔,容易想到dp[i][0/1原创 2021-06-04 21:17:57 · 268 阅读 · 0 评论 -
cf1110D(线性DP好题)
cf1110D(线性DP好题)题意:给n张牌,要么(i,i,i)(i,i,i)(i,i,i)打出,要么三连环打出,问最多能打出的牌思路:首先很显然假如三连环数量超过2个,我们必定可以直接转为3个(i,i,i)(i,i,i)(i,i,i)的形式而不会更劣,所以三连环可以看作是用来补偿的一开始用dp[i]dp[i]dp[i]表示前iii种数所能打出的最大牌数,然后直接通过dp[i−3]dp[i-3]dp[i−3]转移,但是后来发现,这样的状态具备后效性,即之前的策略影响当前的选择。除此之外,我们发现d原创 2021-05-24 19:56:56 · 422 阅读 · 0 评论 -
cf 1312E(区间DP
cf 1312E(区间DP题意:给n个数,每次选两个相等且相邻的数合并变成ai+1a_{i+1}ai+1,问最小长度思路:范围显然区间dpdpdp,我们考虑到对于某个区间来说,如果能压成一个数的话,这个值必定是唯一的若能知道哪些区间能被压成1个数字的话,我们就可以通过线性dp直接求解所以我们用dp[i][j]dp[i][j]dp[i][j]表示将区间[i,j][i,j][i,j]压成一个数字后的数字,0的时候说明无法成功,转移就是正常区间dpdpdp的转移了再之后就是一个非常裸线性dpdpd原创 2021-05-24 19:26:52 · 310 阅读 · 0 评论 -
cf 1304F2 (单调队列优化DP)
cf 1304F2 (单调队列优化DP)题意:给你nnn天,每天有mmm个拍照点,每次拍照是连续两天且拍照颜色不同,每次最多拍连续k段,连续两天就是2*k,每个拍照点有一个权值,求最大权值和思路:容易想到一个dpdpdp,dp[i][j]dp[i][j]dp[i][j]前iii天拍完了,第iii天从jjj这个地方开始拍,注意这个在转移前是一个相机的前一天,但是转移后得把一个相机的另一天计算进去。dp[i][j]=max(dp[i−1][l]+sum[min(j+k−1,m)]−sum[j−1]−重原创 2021-05-22 23:40:50 · 229 阅读 · 0 评论 -
gym 102133 H(dp好题)
gym 102133 H(dp好题)挺难的dp,但是认真想还是可以写写的题意:给你两个字符串,要求这个字符串中部分不相交的长度至少为k的字符串能够组成ab两个字符串思路:首先我们可以转化一下,事实上就是将两个字符串分段拆开,段长度至少为k, 使得他们尽可能匹配,和LCS有点像?显然DP原问题:求两个字符串都匹配构造完的串的最小长度子问题:两个字符串前缀构造完的串的最小长度事实上阶段隐性的是枚举构造的字符串的每一位往下一位转移,并且只有当前段匹配>=k,才能合法,所以状态是dp[i原创 2021-01-13 20:44:17 · 199 阅读 · 0 评论 -
2016 icpc香港区域赛D.Peak Tram
2016 icpc香港区域赛D.Peak Tram题意:建nnn个大楼,不同高度不同costcostcost,问从左到右至少看见kkk个大楼的消费思路:建立大楼的决策很显然,当前要么能看见要么不能看见,所以需要保留建立到第几个,前面最高的高度,以及当前看到多少个。高度其实离散化后一定只有2n22n^22n2个而已dp[i][j][k]dp[i][j][k]dp[i][j][k]表示建完了i座大楼,已经看到了j座,建的最高的长度是a[k],转移要么当前的看不到,要么看得到但是我们还得维护第三个维原创 2020-11-16 21:40:42 · 437 阅读 · 1 评论 -
NC53683
NC53683题意:一行烈焰0:这个格子没有烈焰,且其左右两个格子均没有烈焰1:这个格子没有烈焰,且其左右两个格子中只有一个烈焰2:这个格子没有烈焰,且其左右两个格子中均有烈焰*:这个格子有烈焰?:未告诉你本格情况思路:显然从左到右作为阶段,用dp解决,容易想到当前位置受到i-1和i+1的讨论,状态最重要的是有无烈焰,前一个的约束转移的时候自然就有了,所以我们只需要考虑后一个,dp[i][0/1][0/1]dp[i][0/1][0/1]dp[i][0/1][0/1] 表示到第i个位置,当前原创 2020-10-22 22:00:21 · 252 阅读 · 0 评论 -
洛谷 P1758(管道取珠)
洛谷 P1758(管道取珠)题意:上下两根管子依次弹出珠子,求最后相等序列方案数乘积之和思路:完全没有思路,主要是因为没有注意这个平方,这个平方完全可以拆分为2个同样的游戏,所以就变成了两个游戏同时进行,序列数相同的方案数,容易想到随着子问题缩小而改变需要记录的只有上面弹出的珠子数,所以dp[i][j][k]dp[i][j][k]dp[i][j][k]表示进行到两个都取了i颗珠子,第一个上面取了j,第二个下面取了k个的方案数,直接滚动数组转移即可这题没有思路的关键就是这个独立性拆分!#inclu原创 2020-10-22 21:59:29 · 335 阅读 · 0 评论 -
cf DP专练
决定每天在codeforces上从2300分以上来一道DP练习9.8codeforces 713 C与poj 3666很像的一道题,这题是严格递增,先考虑非严格递增,容易想到修改后的数字就是原来的子集,所以我们可以定义dp[i][j]表示到第i个数字时,该数字在原来离散化排序后的位置是第j大的 转移就是dp[i][j]=min(dp[i][j],dp[i-1][k]+abs(a[i]-b[k]),1<=k<=j,维护下前缀就是n^2的。下面来到这题,所谓严格递增,我们只需要把a[i]-i即原创 2020-09-08 19:46:27 · 392 阅读 · 0 评论 -
poj 1722 线性DP好题
题意:有一个数组,每次可以把a[i]和a[i+1]合并起来,结果为a[i]-a[i+1],问你操作顺序,是最后一个数为他给定的那个数.思路:首先我们容易发现,这样n-1次操作下来,实质是对于n个数分配了+ -号,然后求和,当然第一个数肯定是+,第二个数和最后一个数肯定是负号我们用dp[i][j]表示到第i个数时,第...原创 2020-07-21 17:05:28 · 245 阅读 · 0 评论 -
poj 1934 (LCS+输出路径 好题)
题意:输出LCS的所有不重路径思路:LCS很好求,但是怎么弄出路径呢,容易想到枚举最长下的每个位置的字符,这个可以不用去重。那么怎么枚举呢?设两个pos数组,pos[i][j]表示1到i的子串中字符j的最后一个的出现位置,为什么这么做呢?因为我们只需要这个字符存在即可,哪个位置我们不关心,所以我们尽量让他靠后,这样就可以使得同样状态下前面的枚举具有更优的可能。这样乍看起来是O(26^80)次方,但题目保证不同的串的个数不超过一千个,而我们每次枚举的时候,只会往合法满足LCS的位置递归,所以其实是O(原创 2020-07-19 15:58:28 · 470 阅读 · 0 评论 -
poj 1952 LIS统计方案数
题意:统计最长不上升子序列长度,并统计不重的方案数思路:第一问很简单,就是LIS的模板,下面来讨论方案数,sum[i]表示以a[i]结尾的方案数,如果不重复的话,对于能转移过来的状态,假如dp[j]+1==dp[i],直接+=,假如dp[j]+1>dp[i],就直接=转移,但是,这样会有两种重复情况 32xxxx2 中 ,重复只出现在a[i]==a[j]的时候,第一种重复是xxxx中没有大于2的数字,这样后面2的存在价值就小于前面的那个2,所以当dp[i]=1的时候,就标记为废数,并且只有非废数原创 2020-07-03 12:13:42 · 241 阅读 · 0 评论 -
洛谷P1854 线性DP+路径记录
题意:把花放在花瓶里,每个花对花瓶有不同的val值,输出最大的val和方案思路:很好想的dp,dp[i][j]=max(dp[i-1][k]+a[i][j]),dp在路径记录的时候,一般都开和状态一样的数组,path[i][j]表示使得第i朵花放在第j个花瓶时候最大的上一层放在第几个花瓶,递归输出即可#include<iostream>#include<cstdio>#include<cstring>using namespace std;typedef原创 2020-07-02 17:06:52 · 227 阅读 · 0 评论 -
洛谷P1541 (背包+滚动数组)
题解:裸的背包,显然只用开四维表示四张卡片分别用了多少,直接转移即可,我用滚动数组压了一维,防止MLE#include<iostream>#include<cstdio>#include<cstring>using namespace std;int dp[2][42][42][42],a[360],b[5];int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i&原创 2020-06-22 16:13:06 · 152 阅读 · 0 评论 -
树形DP相关题目总结
最近刷了一些树形DP的题目在此总结一下树形DP:就是在树上做状态转移的一种DP,一般是节点从深到浅(子树从小到大)作为DP阶段,写了很多题DP的第一维通常表示以某节点为根的子树,对每个节点,一般先递归子节点,在回溯的时候在进行转移需要注意的是,由于阶段是以子树划分,所以状态转移时只需考虑子树相应的转移部分,由于满足无后效性,所以想状态转移方程的时候不要考虑根节点对当前子树的影响!!! 无后效性...原创 2020-04-18 18:43:55 · 2265 阅读 · 1 评论 -
POJ - 1661 Help Jimmy
题意:从一个初始位置往下跳,中间有平台,问落到平台上的最小时间是多少思路:一开始想着dp[i][2]表示到达第i个平台时,上一步是从左或者右转移过来,但是这样的话状态有点难搞。这题充分体现了DP的子问题重叠性,对于从第一个点到达终点的过程中,到底怎么分解才可以保证状态转移是方便的,为了排除转移时的状态冗杂,容易想到从一个节点跳下去的时候,只能被最先接到的平台接到,所以思考状态转移的思维方式...原创 2020-03-30 18:06:00 · 151 阅读 · 0 评论 -
poj1179 区间DP +环形处理
PolygonTime Limit: 1000MS Memory Limit: 10000KTotal Submissions: 7506 Accepted: 3232DescriptionPolygon is a game for one player that starts on a polygon with N vertices, like the one in Figure 1...原创 2020-02-28 07:19:40 · 136 阅读 · 0 评论 -
动态规划中的一些无序性排列问题
DP的本质是对问题划分状态空间进行遍历,然而有些无序性的排列问题条件限制较多,条件难以表达,这时可以尝试将无序性的排列问题转换为有序性的插入问题尝试简化问题,下面来看一下几道例题:POJ2279 Mr Young’s Picture Permutations描述: 有N个学生合影,站成左对齐的k排,每行分别有N1,N2…NK个人,第一排站最后,第k排站之前。学生身高依次是1…N。在合影时候要...原创 2020-02-22 08:04:36 · 1104 阅读 · 0 评论