D的实现细节有什么问题?
我D题的dp[i][j]定义的是当前玩家在区间 [i,j] 内的得分减去对手在剩余区间内的得分
然后转移起来这么些不清楚哪里有bug
#include<bits/stdc++.h> #define int long long using namespace std; int a[1010]; int dp[1010][1010]; signed main() { int n; cin>>n; int i; for(i=1;i<=n;i++) cin>>a[i]; for(i=1;i<=n;i++) { dp[i][i]=a[i]; } int len; for(len=2;len<=n;len++) { for(i=1;i<=n-len+1;i++) { int j=i+len-1; int ok=(len%2==1); if(ok==0)//hou手 { dp[i][j]=max(a[i]-dp[i+1][j],a[j]-dp[i][j-1]); } else { if(a[i]>=a[j]) dp[i][j]=a[i]-dp[i+1][j]; else dp[i][j]=a[j]-dp[i][j-1]; } } } int d=dp[1][n]; cout<<d<<endl; int sum=0; for(i=1;i<=n;i++) sum+=a[i]; cout<<(d+sum)/2<<" "<<sum-(d+sum)/2; return 0; }