NOIp2019前dp专题题解1.0

luogu1373 小a和uim之大逃离:暴力dp的话就是记\(dp_{i,j,p,q,0/1}\)表示当前在\((i,j)\),第一/二个人的数模\(k+1\),且当前轮到了第一/二个人的方案数。优化的话考虑答案统计\(p=q\)的方案数,那么可以把那两维省掉直接记两者差值,时间\(O(NMK)\)

luogu1220 关路灯:注意到每次所有关掉的等必然是一个连续区间,且人一定站在区间的两端,于是记\(dp_{i,j,0/1}\)表示已经关掉区间\([i,j]\)的灯,人站在最左/右端的最小花费,预处理出除掉每个区间外的所有灯的每一秒的花费,总时间\(O(n^2)\)

luogu1156 垃圾陷阱:记\(dp_{i,j}\)表示前\(i\)堆垃圾,当前堆到了高度\(j\)的最大血量,转移的话考虑当前这一堆是吃掉还是堆起来,求解答案的话先找到\(dp_{i,m}\)有值的时候\(i\)的最小值,否则就是\(dp_{i,j}\)+第\(i\)堆垃圾出现时间的最大值

luogu1273 有线电视网:树形背包模板题,把用户支出视为正,每条边花费视为负直接背包,时间是\(O(n^2)\)(好像还有个log吧不记得了反正2500能过就对了)

luogu1169 [ZJOI2007]棋盘制作:悬线法模板题,然而也可以写单调栈,时间复杂度\(O(nm)\)

luogu2577 [ZJOI2005]午餐:一个比较显然的贪心是我们把吃饭时间长的放到前面先行考虑,之后用一个类似于背包的设计状态,记\(dp_{i,j}\)表示前\(i\)个人已经完成了,其中第一组打饭时间为\(j\)的最小吃完饭时间,依旧是枚举当前人放在哪一组进行转移

luogu2051 [AHOI2009]中国象棋:问题等价于每一行和每一列放不多于两个炮的方案数,按照套路我们按行转移,同时为了兼顾列的条件,我们记\(dp_{i,j,k}\)表示前\(i\)行,有\(j\)列有\(1\)个炮,有\(k\)列有两个炮的方案数,转移考虑第\(i\)行放0/1/2个炮,对每一种情况还要分它放在有0/1/2个棋子的列,时间\(O(nm^2)\)

猜你喜欢

转载自www.cnblogs.com/encodetalker/p/11330191.html
今日推荐