模拟赛 T3 doge的取数博弈 题解

题面

思路
这道题相对较难,可以采用区间DP的思路。
我们可以先选择先手取走的数,此时将原序列分为左右两部分,后者必然取走和较大的那个部分,而且剩下的部分我们一定提前求过了。

附上核心代码

for(遍历区间长度) {
		for(遍历左右端点) {
			dp[l][r] = ——; // 赋初值
			for(遍历分界点) {
				int x = sum[k-1]-sum[l-1], y = sum[r]-sum[k], z;
				z = max(x + dp[k+1][r], y + dp[l][k-1]); // 取最大值
				dp[l][r] = min(—— ,——); // 状态转移方程
			}
		}
	}