洛谷P2858 [USACO06FEB] 奶牛零食 Treats for the Cows - 区间DP

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
} 

猜你喜欢

转载自blog.csdn.net/Fantasy_World/article/details/81877051