
在此记录一下学习大佬思路的题解吧
#include<iostream>
using namespace std;
const int N = 1010;
int dp[N][N], a[N], s[N]; // f[i][j]表示从i到j的最大得分
int n;
int solve();
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
cin >> a[i];
//类似于数学里的数列求前n项和,s是前缀和数组,预处理
//在这里求出前缀和可以降低复杂度
s[i] = s[i - 1] + a[i];
}
cout << solve() << endl;
return 0;
}
int solve()
{
//枚举区间长度
for (int len = 1; len <= n; len++)
{
for (int i = 1; i + len - 1 <= n; i++)
{
int l = i, r = i + len - 1;
//用两人拿的总和(区域长度总和)减去最小的,就剩下最大的
dp[l][r] = s[r] - s[l - 1] - min(dp[l + 1][r], dp[l][r - 1]);
}
}
return dp[1][n];
}

2065

被折叠的 条评论
为什么被折叠?



