bzoj 1096: [ZJOI2007]仓库建设

本文深入探讨了斜率优化在动态规划中的应用,通过具体问题的解析,详细讲解了如何利用斜率优化来提高DP算法的效率。文章通过实例代码展示了斜率优化的具体实现过程,包括关键变量的定义、状态转移方程的推导以及斜率优化条件的判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

斜率优化

/**************************************************************
    Problem: 1096
    User: lxy8584099
    Language: C++
    Result: Accepted
    Time:2756 ms
    Memory:44264 kb
****************************************************************/
 
/*
    斜率优化
    suml 前i个到第i个的距离和 
    sump 前i个到第i个的数量和 
    sumv 前i个到第i个的经费和 
    sumw = sump*suml 只是为了方便 
    f 前i个 最后一个仓库在i的最优答案 
    sumli <=  (fk-fj+sumvj-sumvk+sumwk-sumwj)/(sumpk-sumpj)
    找了半天错 以为是式子推错了 结果是斜率优化写错了。。。
    luogu AC bzoj WA ????
     
*/
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1000050;
int n,q[N];
ll f[N],sumv[N],suml[N],sump[N],c[N];
double Y(int i) {return (double)(f[i]+1LL*sump[i]*suml[i]-sumv[i]);} 
double X(int i) {return (double)(sump[i]);} 
double xl(int i,int j) {return (Y(j)-Y(i))/(X(j)-X(i));} 
int main()
{
    scanf("%d",&n);
    for(int i=1,p;i<=n;i++)
    {
        scanf("%lld%lld%lld",&suml[i],&p,&c[i]);
        sump[i]=sump[i-1]+p;
        sumv[i]=sumv[i-1]+sump[i-1]*(suml[i]-suml[i-1]);
    }
    for(int i=1,l=1,r=1;i<=n;i++)
    {
        while(l<r&&xl(q[l],q[l+1])<=suml[i]) l++;
        f[i]=f[q[l]]+sumv[i]-sumv[q[l]]-1LL*sump[q[l]]*(suml[i]-suml[q[l]])+c[i];
        while(l<r&&xl(q[r-1],q[r])>=xl(q[r-1],i)) r--;
        q[++r]=i;
    }
    printf("%lld\n",f[n]);
     
    return 0;
}

 

转载于:https://www.cnblogs.com/lxy8584099/p/10322688.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值