杭电DP60道题
1.基础DP(线性)
递推应用:
序列问题:
(点这里)各种序列的模型建立和模板套用
2.背包
如果是第一种问法,要求恰好装满背包,那么在初始化时除了f[0]为0其它f[1..V]均设为-∞,这样就可以保证最终得到的f[N]是一种恰好装满背包的最优解。
如果并没有要求必须把背包装满,而是只希望价格尽量大,初始化时应该将f[0..V]全部设为0。
为什么呢?可以这样理解:初始化的f数组事实上就是在没有任何物品可以放入背包时的合法状态。如果要求背包恰好装满,那么此时只有容量为0的背包可能被价值为0的nothing“恰好装满”,其它容量的背包均没有合法的解,属于未定义的状态,它们的值就都应该是-∞了。如果背包并非必须被装满,那么任何容量的背包都有一个合法解“什么都不装”,这个解的价值为0,所以初始时状态的值也就全部为0了。
这个小技巧完全可以推广到其它类型的背包问题,后面也就不再对进行状态转移之前的初始化进行讲解。
上面链接只给了模板,具体解释(背包九讲)
树形背包详解
3. 区间DP
入门模型(点这里):
石子合并,括号匹配,整数划分,回文串
石子合并模型应用:
洛谷1622释放囚犯 区间DP石子直线型合并的变形(思维一变即可)
洛谷P1063 能量项链 区间DP石子环形合并的变形(决策有点难想)
括号匹配:
整数划分:
回文串 :
Generating Palindromes - lightOJ 1033 区间DP回文串 较简单的应用
简单应用:
这部分题较简单,能看出区间DP的性质,适合练手熟悉区间DP
1031 - Easy Game 简单区间DP
难题:
String painter 区间DP难题 (看了好久才算弄懂)
4.状态压缩DP
5.树形DP
树形背包详解
6.数位DP
大佬博客
7.数据结构优化DP
9.单调队列优化DP
10. 计数类DP
11.数位统计DP
12.环形有后效性处理
13.斜率优化
14.四边不等式