[BZOJ1911]APIO2010特别行动队|斜率优化DP

本文介绍了一种使用斜率优化技巧解决动态规划问题的方法。通过具体实现代码展示了如何利用斜率优化来提高DP算法的效率,并给出了完整的C++代码示例。

DP比较显然,直接上斜率优化就好了。。

斜率优化笔记

#include<iostream>
#include<cstdio>
#include<memory.h>
#include<cstdlib>
#include<math.h>
#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,x[maxn],que[maxn];
ll sum[maxn],dp[maxn],a,b,c;
ll sqr(ll x) {return x*x;}
ll G(int i) {return dp[i]+a*sqr(sum[i])-b*sum[i];}
ll H(int i) {return a*sqr(sum[i])+b*sum[i]+c;}
ll get(int i)
{
	while (tail>head&&2*a*sum[i]*(sum[q2]-sum[q1])<G(q2)-G(q1)) head++;
//	printf("%d %d*\n",i,q1);
	return -2*a*sum[i]*sum[q1]+G(q1)+H(i);
}
void ins(int i)
{
	while (tail>head&&(G(i)-G(t1))*(sum[t1]-sum[t2])>(G(t1)-G(t2))*(sum[i]-sum[t1])) tail--;
	que[++tail]=i;
}
int main()
{
	freopen("1911.in","r",stdin);
	scanf("%d",&n);
	cin>>a>>b>>c;
	sum[0]=dp[0]=0;
	for (i=1;i<=n;i++)
	{
		scanf("%d",&x[i]);
		sum[i]=sum[i-1]+(ll)x[i];
	}
	head=tail=1;que[1]=0;
	for (i=1;i<=n;i++)
	{
		dp[i]=get(i);
		ins(i);//printf("%I64d %I64d\n",dp[i],G(i));
	}
	cout<<dp[n];
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值