版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Fantasy_World/article/details/81877051
其实不是典型的区间DP。。。顶多拿区间当状态
这题的状态可能有点难想,但是可以想象到在问题过程中有个东西在单调变化(而且“重叠”,“可转移”)那么由DP的定义可以知道这就是我们要的状态了:区间
设flr表示糖果目前剩下l ~ r区间没被拿走,然后反着进行过程,把糖果一个个放回去,最后放满
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
using namespace std;
#define debug(x) cerr << #x << "=" << x << endl;
const int MAXN = 100000 + 10;
int f[2005][2005], v[MAXN],n;
int main() {
scanf("%d", &n);
for(int i=1; i<=n; i++) {
scanf("%d", &v[i]);
f[i][i] = v[i]*n;
}
for(int k=2; k<=n; k++) {
for(int l=1; l+k-1<=n; l++) {
int r = l+k-1;
f[l][r] = max(f[l+1][r] + v[l]*(n-(r-l)), f[l][r-1] + v[r]*(n-(r-l)));
}
}
printf("%d", f[1][n]);
return 0;
}