洛谷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; }