dp
状态与维度
维度是描述一个事物的不同角度,是允许该事物在某些方面的自由变化范围。因此,万事万物都有无数个维度,事实上,解决具体问题时并不需要考虑它的无数维度,只需要分解几个需要的维度即可。如,要了解一个人的学习状况,他的身高体重是不需要的,只需要了解各科的成绩。
分析事物需要多个维度,反之多个维度就可以描述一个事物,描述一个事物的多个维度就是状态。对应高级语言的数组,如f[i][j][k],一共3个数组维度,每个维度可以在0-i-1,j-1,k-1范围内编号,如果为3个维度变量i,j,k赋予一个特定含义,便是状态,而3个维度确定的单元格f[i][j][k] 就是该状态下的答案。
动态规划的状态要求无后效性,即从一个状态出发不能回到当前状态。用动态规划解决问题的一般步骤是:定义状态-确定状态转移-写出状态转移方程-优化。
1、确定状态
状态的参数一般有
1)描述位置的:前(后)i单位,第i到第j单位,坐标为(i,j)等
2)描述数量的:取i个,不超过i个,至少i个等
3)描述对后有影响的:状态压缩的,一些特殊的性质
2、转移方程
1)检查参数是否足够;
2)分情况:最后一次操作的方式,取不取,怎么样放,前一项是什么
3)初始条件是什么。
4)注意无后效性。比如说,求A就要求B,求B就要求C,而求C就要求A,这就不符合无后效性了。
3、 编程实现方式
1)递推(注意顺序:逆推、顺推)
2)记忆化搜索(一般在状态的拓朴顺序不很明确时使用)