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]

由于分数存在负数,所以要加上修正值。

posted @ 2018-09-11 22:30  诚信肥宅  阅读(137)  评论(0编辑  收藏  举报