小srf的游戏 题解

【题目描述】

srf和qtc在一个规模为 1 × n 的棋盘中下棋。规则是:

第一个人可以下在第1 到 m 中的任意一个位置。接下来每一个人可以下在第 i + 1 到 i + m 的任意一个位置,其中i为上一个人下棋的位置。

每个格子里有一个数,如果一个人下棋在格子i,会得到a[i]的分值。

当不能继续操作时,结束。

小srf请你帮他算一下,当他和qtc都采取最优策略时,他的得分减去qtc的得分。

【输入】

第一行:两个正整数n和m,用空格隔开。

第二行:n 个数,表示棋盘上的数字。

【输出】

两行,每行各一个数, 第一个数为srf先手时的答案, 第二个数为qtc先手时的答案。

【输入样例1】

1 3

1

【输出样例1】

1

-1

【输入样例2】

2 100

2 2

【输出样例2】

2

-2

【样例说明】

对于30% 的数据,n ≤ 15;

对于60% 的数据,m ≤ 100;

对于100% 的数据,1 ≤ n ≤ 100000,1 ≤ m,a数组中的数保证在int范围内。

 

//

学习了http://www.mamicode.com/info-detail-2494996.html 中第二题的解法,他的排版有点问题,详细描述下动态转移方程如下:

dp[i][0]=max(dp[j+1][1]+a[j])其中 j in(i, min(i+m-1,n)

dp[i][1]=min(dp[j+1][0]-a[j]) 其中 j in(i,min(i+m-1,n)

相当于0是从后往前找,其中每个i,找到最大的dp[j][1]+a[j]的值,付给当前的i。j和当前i的距离,不超过m值。

因为是每一步最优,从后往前,就能保证当前的值,肯定是后面最优的值产生的,所以当前格子的动态转移方程就是找当前格子后面的,取某一个格子能是最大或最小值的情况。

其中找最大值的操作,是通过单调队列实现的,可减小计算量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值