【题目描述】
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值。
因为是每一步最优,从后往前,就能保证当前的值,肯定是后面最优的值产生的,所以当前格子的动态转移方程就是找当前格子后面的,取某一个格子能是最大或最小值的情况。
其中找最大值的操作,是通过单调队列实现的,可减小计算量。