您的位置:首页 > 其它

1308 取数游戏

2016-07-14 07:57 337 查看
Description

  Alice想让Bob陪他去看《唐山大地震》,但由于Bob是个很感性的人,怕流泪不想去,但又不好意思以这个作为拒绝的理由,便提出玩一个游戏。

  N个正整数围成一圈,规则如下:

  •两个玩家轮流取数;

  •最开始先手的玩家可以取任意一个数x;

  •从第二步开始当前玩家只能取x(上一玩家刚刚取的数)左右两边相邻的数;

  •直到取完所有的数,游戏结束;

  •取得较多奇数的玩家获胜。

  Bob为了显示大度,让Alice先取,但他忘了自己和Alice都是绝顶聪明之人,现在Alice请你帮他计算第一步有多少种取法使得最终获得胜利。

题解:

枚举第一手取的点,把剩下的数拆成一条数列,预处理出每段区间奇数的个数,dp

f[j,l]:=max(s[l]-s[j-1]-f[j+1,l],s[l]-s[j-1]-f[j,l-1]);

代码(节选):

for j:=1 to n do

if a[j] mod 2=1 then

f[j,j]:=1;

for j:=1 to n do

begin

s[j]:=s[j-1];

if a[j] mod 2=1 then s[j]:=s[j]+1;

end;

for k:=1 to n-2 do

for j:=1 to n-k do

begin

l:=k+j;

f[j,l]:=max(s[l]-s[j-1]-f[j+1,l],s[l]-s[j-1]-f[j,l-1]);

end;

f[1,n]:=s
-f[2,n];

if s
div 2+1<=f[1,n] then inc(ans);

k:=a[1];

for j:=1 to n do

a[j]:=a[j+1];

a
:=k;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  1308