dp乱刷
大部分是做过的题其实,主要是明年要NJUCS夏令营了,复习一下算法这块的东西,过于简单的题就不放在这里了。
CF1271D Portals
思维点:每个城堡可以在其最晚可以被派遣到的时间被派遣,因为在最晚时间之前派遣的方案可以直接变为对应的在最晚时间派遣的方案。
然后尽情DP即可。
P1450 [HAOI2008] 硬币购物
巧妙的容斥,用没有条件限制的方案数减去不合法的方案数。首先按无限背包做,然后减去某一种硬币\(i\)超额的方案数,即\(f[s-(d_i+1)*c_i]\),然后根据容斥原理加回来某两种硬币超额方案数,再减去三种超额的方案数,再加回来四种超额的方案数。
CF235B Let's play osu
设在\(i\)处当前combo提供分数期望\(E(x^2)\),则\(E((x+1)^2)=E(x^2)+E(2x+1)\),答案就是累加各位置产生的\(E(x^2)\)差分,注意区分答案和平方的期望。
P2365 任务安排
简单地考虑,可以设出\(f(i,j)\)前\(i\)个任务分了\(j\)批的最小费用,但是时间复杂度显然过大,考虑到这个题对分多少批没有限制,并且每次做出一个分批操作,这次操作对以后的影响是确定的,故可以采用费用提前的方式把分批带来的开销提前算入dp数组,这样状态就可以简化为\(f(i)\)前\(i\)个任务最小花费(包含分批产生的预支费用),然后斜率优化可以。
P2466 [SDOI2008] Sue 的小球
和关路灯那题一样的状态设法,不过这个题也要费用提前,因为走某段路程对以后的得分影响是确定的。
P2592 [ZJOI2008] 生日聚会
一开始我设的是\(f(i,j)\)长为i序列男女数量差为\(k\),但是没法处理男最多\(n\)女最多\(m\)的限制。这题应该设\(f(i,j,k,l)\)选了\(i\)个男\(j\)个女,所有后缀男数量减女数量最大差\(k\),最小差\(l\),然后转移枚举队尾放男还是女就行。为什么状态中只需要保证所有后缀合法?因为当前状态一定是从一个合法状态转移过来的,非后缀区间在先前的某个合法状态中已经被包含了,这些区间在后继状态中也一定是合法的。
P2964 [USACO09NOV] A Coin Game S
博弈论类型的dp在转移时一般只从一个人的角度考虑最优就行,即转移的时候从多个合法状态中对手最优的那个状态转移过来,这道题设\(f(i,j)\)从\(i\)到\(n\)放硬币,当前玩家放\(k\)个的最优解。为什么不是正着取?因为正着取的话你会发现转移方程比较复杂。
P3509 [POI2010] ZAB-Frog
设\(f(i)\)第\(i\)次走到哪里,\(f(i)\)求解直接根据\(f(i-1)\)求解即可。这道题步数很多,但我们发现第i步位于哪里和之前怎么走无关,只和走这一步之前在哪有关,于是我们可以预处理出从每一个位置走多少步能到哪里,求出每个位置走一步能到的位置之后倍增就可以求出走2的次幂步能到的位置,就可以求出答案。
P4766 [CERC2014] Outer space invaders
发现线性dp没法搞(如果设\(f(i)\)截止\(i\)的最小花费就会发现无论在每个外星人开始时杀死还是结束时杀死都会有后效性),然后看到这个数据范围,考虑区间dp,设\(f(i,j)\)消灭完全包含在该区间的外星人的最小花费,转移就枚举分界点\(k\),两子区间代价加上跨越分界点距离最远的外星人转移就行
P5664 [CSP-S2019] Emiya 家今天的饭
和硬币购物那个问题一样,都是用所有方案减去不合法方案。计算违反限制3的方案可以枚举违反限制的那一列,然后设\(f(i,j,k)\)前\(i\)行这一列选\(j\)个,其余列选\(k\)个的方案数,进一步优化的话我们发现无需关心总共选了几行,只需要关注选在这一列的行数比选其他列的行数多出多少,即\(f(i,j)\)前\(i\)行,当前列比其他列多\(j\)个的方案数,所有列所有\(j>0\)的\(f(n,j)\)和就是不合法方案数。
P6835 [Cnoi2020] 线形生物
直接设到某点期望步数为状态复杂度爆炸,因为这种随机游走的问题一般需要高斯消元解决后效性问题,所以我们需要设一个没有后效性的dp状态。我们发现对于非\(i->i+1\)的边,全是返祖边,于是可以设\(f(i)\)从\(i\)到\(i+1\)步数的期望,详细的过程可以看这里
P6280 [USACO20OPEN] Exercise G
容易发现是求所有情况下和为\(n\)的若干数的最小公倍数之和是多少。求最小公倍数可以用算数基本定理分解质因数求解,于是考虑对和为\(n\)的这些数质因数分解。设\(lcm=p_1^{k_1}*p_2^{k_2}*...*p_l^{k_l}\),只要有\(n>=p1^{k_1}+p_2^{k_2}+...+p_l^{k_l}\)就可以让若干和为\(n\)的数最小公倍数为\(lcm\),因为前面不等式中大于的部分用1补就好了,对最小公倍数没有影响,然后设\(f(i,j)\)前\(i\)个质数和为\(j\)的答案就行。