Luogu P2858 [USACO06FEB]Treats for the Cows G/S题解

【问题分析】

此题题目意思每次取左或右的零食。

按区间dp的惯例,要区间从小到大dp。

上代码。

【Code】

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N = 2000 + 5;
 4 int f[N][N], a[N];
 5 //f[i][j]:最后做i-j区间的最大值
 6 int n;
 7 int main()
 8 {
 9 scanf ("%d", &n);
10 for (int i = 0;i < n; i++)
11 {
12 scanf ("%d", a + i);
13 f[i][i] = a[i] * n;
14 //最后一个必定过了n天
15 //这是最小的区间,以此为初始值
16 }
17 for(int len = 1;len < n; len++)
18 //len为i后面跟着的数量
19 for(int i = 0, j = len + i;j < n; i++, j++)
20 f[i][j] = max(f[i + 1][j] + a[i] * (n - len), f[i][j - 1] + a[j] * (n - len));
21 //第一段是选左边,第二段是选右边
22 printf ("%d", f[0][n - 1]);
23 //所有的最大值在f[0][n-1]中
24 return 0;
25 }

 

【代码调试】

1. 测试样例

2. 自测数据(边界值,特殊值, 本题中有特殊值了)

输入:

7

100

100

100

100

100

1

101

输出:

2603

完结撒花~~睡觉去喽~~

posted @ 2022-01-08 13:04  睡不醒的凪  阅读(32)  评论(0)    收藏  举报