1dp[i][j]表示的是在i到j这段采用最优策略当前能取得的最大值,每次我要么取第一个元素,要么取最后一个元素。所以
转移方程:dp[i][j]=a[i]+a[i+1]+······+a[j-1]+a[j]-min(dp[i+1][j],dp[i][j-1])
2然后我们来考虑一下能不能将dp压成一维的,我们发现每次只与i和i+1有关,所以我们用dp[i]表示从i开始的l个元素能取到的最大值,再用一个s数组表示前缀和。
转移方程:dp[i]=s[j]-s[i-1]+min(dp[i],dp[i+1])
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int dp[10100],s[10100];
int n;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++) {scanf("%d",&dp[i]);s[i]=s[i-1]+dp[i];}
for (int l=1;l<n;l++)
for (int i=1;i+l<=n;i++) dp[i]=s[i+l]-s[i-1]-min(dp[i],dp[i+1]);
printf("%d %d\n",dp[1],s[n]-dp[1]);
return 0;
}