解释
用于处理较复杂问题,可以将一个问题分成多个子问题,再将子问题继续拆分成更小的问题,直到能够解决.
因而找到状态转移方程很重要
处理时,一般会加上记忆化,因为这么多个子问题,很可能有相同的.
但dp无法解决有环(相互依赖)的问题,一般用于解决拓扑图这样,可以由上向下递推的问题.
如果有环,可以用枚举的方法来破环,枚举环中一个点的状态,以此状态递推即可.
示例(01背包):
只需要考虑一个东西选或不选,记录下考虑了几个物品,剩余多少体积时的最优解.
其中记录考虑了几个物品时,可以用滚动数组的方式来减小空间
转移方程为dp[i]=max(dp[i],dp[i-v[j]]+val[j]).
方法
在进行dp时,常常需要用到许多方法:
状态压缩
n一般<=20.
用一个二进制数表示各个单位的状态来实现递推.
数位dp
当n为10^18级别时
只需根据题目意思确定每一位的限制,并以此从一位一位看,而非一个数一个数来判断.