状态压缩dp
1)首先是状态的压缩。一般采用二进制,有时候会用三进制或是其他的,根据每个点状态的个数。像travelling那道,每条路径最多可以走两遍所以就用0,1,2来存储每个点的状
态。要会用各种位运算。
像看相邻元素不相邻用'<<'比较等等。
2)状态的优化,有时候可以预处理一些状态,仅将合理状态保存下来,corn fields.
3)找状态。和矩阵快速幂差不多,一般来说看他和上面的几个状态有联系就用几维的,抓住联系点。corn fields,与上面的一行有联系,所以记录下此行的状态s,找出与上一行的联
系,dp[s][i]=sum(dp[s1][i-1]),s与s1满足一些条件; 炮兵阵地,与上面的两行都有联系,所以记录下当前行的状态s1和上一行的状态s2,dp[i][s1][s2]=max(dp[i][s1][s2],dp[i-1][s2]
[s3]+num[s1]);
4)正推和反推。像travelling,以当前的i为起点,看所能到达的点,如果该点已经访问了两次就不再访问,否则访问。这样会更简单。
5)一定要注意找好边界条件。