Luogu [P3622] [APIO2007]动物园

题目链接

比较费脑子的一道题

先说题目核心思想 : 状压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
*/

 

Luogu [P3622] [APIO2007]动物园

上一篇:PHP pdf转png windows版本


下一篇:win10 系统中vscode 的终端 shell 设置