洛谷3004 [USACO10DEC]宝箱Treasure Chest

题目:https://www.luogu.org/problemnew/show/P3004

一眼看上去就是记忆化搜索的dp。像 一双木棋 一样。

  结果忘了记忆化。T了5个点。

然后加上记忆化。MLE。

参考一些,改成循环的dp。还是MLE。哈哈,根本没改数组大小嘛!

又参考一些。

  分析转移,发现它可以设计成滚动数组。

总之就是这样一道明明是简单题的题。自己还是需要多练习……

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,a[5005],dp[2][5005],sum;
int rdn()
{
    int ret=0,fx=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')fx=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')(ret*=10)+=ch-'0',ch=getchar();
    return ret*fx;
}
int main()
{
    n=rdn();
    for(int i=1;i<=n;i++)a[i]=rdn();
    for(int i=n;i;i--)
    {
        memset(dp[i&1],0,sizeof dp[i&1]);
        dp[i&1][i]=a[i];sum=a[i];
        for(int j=i+1;j<=n;j++)
        {
            sum+=a[j];
            dp[i&1][j]=max(sum-dp[(i+1)&1][j],sum-dp[i&1][j-1]);
        }
    }
    printf("%d",dp[1][n]);
    return 0;
}
原文地址:https://www.cnblogs.com/Narh/p/9194869.html