动态规划的核心:状态和状态转移方程
状态转移方程的计算方法:
1、递推计算,关键是边界和计算顺序;
2、记忆化搜索,所谓记忆化搜索就是搜索的形式+动态规划的思想,不必事前确定各状态的计算次序,但要记录每个状态是否被访问过。
动态规划扩展:
1、状态压缩动态规划
需要的基础知识:位运算 ( ~ , & , ^ , | );
下面介绍一些位运算知识点:
判断数i的二进制形式的第j位是否为1 : i&(1<<j) ,如果为1则大于1,否则结果为0
现假设i&j = x ;如果x == 0,说明在i和j中没有一位同时为1,否则说明至少存在一位同时为1
i&(i<<1);如果i的二进制中有相邻两位都为1,则结果>0;否则结果为0
~是取反位运算符,比如0011,取反为1100,但是在实际使用中要注意符号问题
如果想判断i的二进制的第32位是否为1,long long a = 1; if( i & (b<<32)) 通过这个来判断
动态规划的状态有时候比较难,不容易表示出来,需要用一些编码技术,把状态压缩的用简单的方式表示出来。典型方式:当需要表示一个集合有哪些元素时,往往利用2进制用一个整数表示。
一般有个数据 n<16 或者 n<32 这个很可能就是状态DP的标志,因为我们要用一个int的二进制来表示这些状态。要注意好这些数据规模的提示作用。
2、数位DP
数位DP的一般是以数位为单位,通过推到求出状态转移方程。--------------------2014/5/10