题意:n个价值的东西,A,B两个人可以从最左或最右拿加入自己的分数,都想尽量大,问A-B
思路:dp[i][j]表示当前这个人取l-r区间的最大值是多少,即为max(sum(a[l]+...a[r])-dp[l][r-1],sum(a[l]+...a[r])-dp[l+1][r]);
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int inf=-1e9; 4 5 int dp[1100][1100]; 6 int a[1100]; 7 int n; 8 9 int hh(int l,int r){ 10 if(dp[l][r]!=inf) return dp[l][r]; 11 if(l>r) return dp[l][r]=0; 12 int sum=0,ans=inf; 13 if(l<=r) sum+=a[r]-a[l-1]; 14 if(l<=r){ 15 ans=max(ans,sum-hh(l+1,r)); 16 ans=max(ans,sum-hh(l,r-1)); 17 } 18 return dp[l][r]=ans; 19 } 20 int main(){ 21 int t; 22 cin>>t; 23 while(t--){ 24 scanf("%d",&n); 25 for(int i=1;i<=n+1;i++) 26 for(int j=1;j<=n+1;j++) dp[i][j]=inf; 27 for(int i=1;i<=n;i++){ 28 int x; 29 scanf("%d",&x); 30 a[i]=a[i-1]+x; 31 32 } 33 int x=hh(1,n); 34 cout<<x-(a[n]-x)<<endl; 35 } 36 }