题面:
思路:
这道题相对较难,可以采用区间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(—— ,——); // 状态转移方程
}
}
}