[BZOJ1096]ZJOI2007仓库建设|斜率优化DP

看起来就是要分成若干段嘛,然后求出前缀和YY一些状态转移方程,上斜率优化。。

我的笔记

#include<iostream>
#include<cstdio>
#include<memory.h>
#include<cstdlib>
#define ll long long
#define q1 que[head]
#define q2 que[head+1]
#define t1 que[tail]
#define t2 que[tail-1]
#define maxn 1000005
using namespace std;
int i,j,n,head,tail,c[maxn],x[maxn],p[maxn],que[maxn];
ll sump[maxn],sum2[maxn],dp[maxn];
ll G(int i) {return dp[i]+sum2[i];}
ll H(int i) {return (ll)x[i]*sump[i]-sum2[i]+(ll)c[i];}
ll get(int i)
{
    while (tail>head&&x[i]*(sump[q2]-sump[q1])>G(q2)-G(q1)) head++;
    return -x[i]*sump[q1]+G(q1)+H(i);
}
void ins(int i)
{
    while (tail>head&&(G(i)-G(t1))*(sump[t1]-sump[t2])<(G(t1)-G(t2))*(sump[i]-sump[t1])) tail--;
    que[++tail]=i;
}
int main()
{
    scanf("%d",&n);
    sump[0]=sum2[0]=dp[0]=0;
    for (i=1;i<=n;i++)
    {
        scanf("%d%d%d",&x[i],&p[i],&c[i]);
        sump[i]=sump[i-1]+(ll)p[i];
        sum2[i]=sum2[i-1]+(ll)x[i]*(ll)p[i];
    }
    head=tail=1;que[1]=0;
    dp[1]=get(1);ins(1);
    for (i=2;i<=n;i++)
    {
        dp[i]=get(i);
        ins(i);
    }
    cout<<dp[n];
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值