P2858 [USACO06FEB]Treats for the Cows G/S

原题链接

考察:区间dp

思路:

       和矩阵取数游戏P1005(本题的加强版)不能说很像,简直就是一模一样.f[l][r]区间表示卖掉[l,r]区间的最大收益,但是我们只能买两边的值,因此分为两类,卖l和卖r

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 const int N = 2010;
 7 int a[N],f[N][N];
 8 int main() 
 9 {
10     int n;
11     scanf("%d",&n);
12     for(int i=1;i<=n;i++) scanf("%d",&a[i]);
13     for(int len=1;len<=n;len++)
14       for(int l=1;l+len-1<=n;l++)
15       {
16            int r = l+len-1;
17            f[l][r] = max(f[l][r],f[l+1][r]+a[l]*(n-r+l));
18            f[l][r] = max(f[l][r],f[l][r-1]+a[r]*(n-r+l));
19       }
20     printf("%d\n",f[1][n]);
21     return 0;
22 }

 

2021.3.15 二刷完全没看出来是区间dp,以线性DP的思维想了半天

posted @ 2021-02-11 13:44  acmloser  阅读(67)  评论(0编辑  收藏  举报