ACM-ICPC 2018 徐州赛区网络预赛 A,B
A. Hard to prepare
题面比较复杂,先介绍下题意:
n个二进制数字围成一圈,每个数字有k位,相邻的数字至少有一位是相同的,问有多少种合法方案(对1e9+7取模)。
这种描述是题意的简化,不过为了方便理解,我换一种说法:
n个人坐成一圈,人一共有k个特点,相邻坐着的人至少要有一个相同特点,问有多少种合法方案。
很显然,这样我们可以这样划:特点完全相同的人(p1),特点完全不同的人(p3),和介于两者之间的人(p2)。
对于一个人来说,能坐在他旁边的只能是p1和p3,那么我们考虑合法方案,就是从第一个人开始绕一圈,找到最后一个人时p1+p2的值。
当我们在第一个人时,p1=2^k,p2=0,p3=0。
假设我们在第i个人时p1=s1,p2=s2,p3=s3。
那么在第i+1个人时:
p1的情况:s1+s2
p3的情况:s2+s3
由于p1,p3是固定的一种,所以只要是与其有一项特点相同(p2),就可以生成一个。
而p2的情况复杂一些,p2共有2^k-2种,所以从p1生成的p2共有s1*(2^k-2)种,p3同理,但p2到p2的情况略有些复杂,因为p1/p3都与p2至少有一项相同,是合法的,但p2内部可以出现相反的情况:
比如p1=000 ,p3=111
p2则可以有010和101,100和011,这些是不能互相生成的。
这个问题我们可以换个角度来考虑:
对于某个特点的人,他旁边能坐的人一共有2^k-1种,所以有:
(p1+p2+p3)*(2^k-1)=P1+P2+P3(前一个状态到下一个状态)
所以可以求出p2到p2共有s2*(2^k-3)种
B. BE, GE or NE
数据范围考虑,可能是个O(n*200)复杂度的dp,并且是要从后往前的,显然从前往后的局部最优解并不是全局最优解。
Dp方程如下:
如果当前为GE方:dp[i][j]=max(dp[i+1][j],dp[i][j]+操作1/操作2/操作3)
如果当前为BE方:dp[i][j]=min(dp[i+1][j],dp[i][j]+操作1/操作2/操作3)
其中i,j表示在第i步时,此时分数为j时,当前能到达的最优结局为dp[i][j]
由于分数存在负数,所以要加上修正值。