1308 取数游戏

本文介绍了一个关于数字游戏的策略问题,两个玩家轮流从环状排列的正整数中取数,目标是获得更多的奇数。文章提供了详细的解决方案,包括枚举、区间划分、动态规划等步骤,并附带了部分实现代码。

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[n]-f[2,n];
if s[n] div 2+1<=f[1,n] then inc(ans);
k:=a[1];
for j:=1 to n do
a[j]:=a[j+1];
a[n]:=k;

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值