[USACO10DEC]宝箱Treasure Chest

区间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\n",f[1]);
}
Treasure Chest

 

posted @ 2018-10-02 14:56  SWHsz  阅读(169)  评论(0编辑  收藏  举报