题解 P2858 【[USACO06FEB]奶牛零食Treats for the Cows】

· · 题解

由题意可知每次只能取两端的零食。这就可以看出来这是一道区间DP题。

我设计出了一个状态 :

```cpp #include <cstdio> #define re register #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) const int N = 2e3+10; int n; int a[N]; int f[N][N]; int s[N]; int dfs(int l,int r) { if(f[l][r]) { return f[l][r]; } f[l][r]=max(dfs(l+1,r)+(s[r]-s[l])+a[l],dfs(l,r-1)+(s[r-1]-s[l-1])+a[r]); return f[l][r]; } void Input() { scanf("%d",&n); for(re int i=1; i<=n; ++i) { scanf("%d",&a[i]); f[i][i]=a[i]; s[i]=s[i-1]+a[i]; } } void Solve() { printf("%d",dfs(1,n)); } int main(void) { Input(); Solve(); return 0; } ``` 码字挺累的,望过审。