区间DP,但是卡空间。
n2的就是f[i,j]=sum[i,j]-min(f[i+1][j],f[i][j-1])表示这个区间和减去对手取走的最多的。
但是空间是64MB,就很难受
发现一定是由大区间转移到小区间,区间长度差为1
式子变成 :f[i,i+len]=sum[i,i+len]-min(f[i+1,i+len],f[i,i+len-1])
然后就枚举len,就可以求出结果。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int N=5005; int n,c[N],f[N],sum[N]; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&c[i]),sum[i]=sum[i-1]+c[i];f[i]=c[i]; } for(int i=2;i<=n;i++) { for(int j=1;j<=n-i+1;j++) { f[j]=sum[i+j-1]-sum[j-1]-min(f[j+1],f[j]); } } printf("%d ",f[1]); }