比较费脑子的一道题
先说题目核心思想 : 状压dp
环的处理我们先不管。
我们设 dp[j][s] 表示 到达动物 j 且 [ j , j+5) 这五个动物状态为s时 最多能使多少小朋友开心。
其中,s为 0~31 的整数,二进制下的s表示[ j , j+5) 这五个动物状态,0表示不选,1表示选,特别注意,[ j , j+5) 分别对应s从右往左数的每个数字,例如s = 18 ,二进制下表示为10010 ,即 j 到 j+4 的状态为 0 , 1 , 0 , 0 , 1。
可得状态转移方程:dp[j][s] = min( dp[j-1][(s&15)<<1] , dp[j-1][(s&15)<<1|1] ) + num[j][s];
解释:15 的二进制为01111,(s&15) 即取 [ j , j+5) 的前 4 个数的状态。然后 <<1 代表作为 [j-1 , j+4)的后四个状态,对j-1的状态枚举一下是0还是1,取个min,再加上num[j][s]就行了
num[j][s]为已经预处理出来的数组,它的意思为:
[ j , j+5)这几个动物状态为s时开心的小朋友数。
还是有点懵?没事,将上面的解释结合下图来看:
/* 当前 j=3 , s=18 (10010) , s&5=2 (0010) 动物: 1 2 3 4 5 6 7 8 9 10 下标: j-1 j j+1 j+2 j+3 j+4 s状态: 0 1 0 0 1 (s&5)为: 0 1 0 0 (s&5)>>1状态: 0 0 1 0 0 (s&5)>>1|1状态: 1 0 1 0 0 */