bzoj 1010

本文通过一个具体的例子详细介绍了如何使用斜率优化技巧来优化动态规划算法。文章讲解了如何推导公式并实现代码,同时强调了理解函数凸性的关键性。

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

这是一个大水题

斜率优化dp

推一推式子

#include<bits/stdc++.h>
#define lca long long 
using namespace std;
const int MX = 50005 ;
lca n,l,p,q[MX];
lca c[MX],dp[MX];

double getk(int pos)
{
    int x=q[pos],y=q[pos-1];
    return (double)(dp[x]+(c[x]*c[x])-dp[y]-(c[y]*c[y]))/(double)(c[x]-c[y]);
}

int main()
{
   scanf("%lld%lld",&n,&l);
   for(int i=1;i<=n;i++) scanf("%lld",&c[i]),c[i]+=c[i-1]+1;
   int h=1,t=0;
   q[++t]=0;
   for(int i=1;i<=n;i++) 
   {
      lca T=2*(c[i]-l-1);
      while(h<t&&getk(h+1)<T) h++;
      int tem=q[h];
      dp[i]=dp[tem]+(c[i]-c[tem]-l-1)*(c[i]-c[tem]-l-1);
      q[++t]=i;
      while(h<t&&getk(t)<getk(t-1)) q[--t]=i; 
   }
   printf("%lld\n",dp[n]);
}

心得:
1.凸包非常的好!
2.要搞清楚到底是下凸的函数还是上凸的。
这个非常重要 一定要算清楚 想清楚 把图画清楚

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值