区间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;
}

优质内容筛选与推荐>>
1、名字/标识符
2、python实现汉诺塔程序
3、2010年5月学习计划
4、【转载】TypeScript学习笔记——var与let
5、利用TableAdapter Configuration Wizard创建数据访问层二


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号