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
完结撒花~~睡觉去喽~~

浙公网安备 33010602011771号