区间DP 洛谷P2858牛奶零食

题目链接

题意:你有n个货物从1-n依次排列,每天可以从两侧选一个出来卖,卖的价格是当天的天数乘该货物的初始价格,问这批货物卖完的最大价格

输入:第一行n,之后是n个货物的初始价值

这道题不能用贪心做,因为可能存在右端点非常大,但其左边的数非常小, 但因为右端点太大而没被及时卖出

如:9 9 9 1 1 10

贪心:sum=9*1+9*2+9*3+1*4+1*5+10*6=123

而正解为150,也就是说这个题当前的决策会影响到后面的一些决策,不能贪心

dp[i][j]是区间i到j的货物卖完的最大价格

DP的话第一层循环长度,第二层循环左端点

#include <bits/stdc++.h>
using namespace std;
const double pi=acos(-1);
const int mod=1e9+7;
const int maxn=2010;
const int inf=1<<30;
typedef long long ll;
int v[maxn];
int dp[maxn][maxn];
int main(){
    int n;scanf("%d",&n);
    for(int i=1;i<=n;i++)scanf("%d",&v[i]);
    for(int i=1;i<=n;i++)dp[i][i]=v[i]*n;
    for(int i=2;i<=n;i++){
        for(int l=1;(l+i-1)<=n;l++){
            int r=l+i-1;
            dp[l][r]=max(dp[l+1][r]+(n-i+1)*v[l],dp[l][r-1]+(n-i+1)*v[r]);
        }
    }
    cout<<dp[1][n]<<endl;
    return 0;
}

 

posted @ 2019-03-27 20:45  清酒令  阅读(216)  评论(0编辑  收藏  举报