博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Print Article HDU - 3507 -斜率优化DP
阅读量:6966 次
发布时间:2019-06-27

本文共 1192 字,大约阅读时间需要 3 分钟。

思路 :

1,用一个单调队列来维护解集。

2,假设队列中从头到尾已经有元素a b c。那么当d要入队的时候,我们维护队列的下凸性质,

即如果g[d,c]<g[c,b],那么就将c点删除。直到找到g[d,x]>=g[x,y]为止,并将d点加入在该位置中。

3,求解时候,从队头开始,如果已有元素a b c,当i点要求解时,如果g[b,a]<sum[i],

那么说明b点比a点更优,a点可以排除,于是a出队。最后dp[i]=getDp(q[head])。

#include
using namespace std;#define maxn 543210int dp[maxn],q[maxn],m;int sum[maxn],head,tail,n;int getdp(int i,int j){ return dp[j]+m+(sum[i]-sum[j])*(sum[i]-sum[j]);}int fenmu(int j,int k){ return 2*(sum[j]-sum[k]);}int fenzi(int j,int k){ return dp[j]+sum[j]*sum[j]-(dp[k]+sum[k]*sum[k]);}int main(){ while(scanf("%d%d",&n,&m)!=EOF) { tail=-1; head=sum[0]=dp[0]=0; for(int i=1; i<=n; i++) { scanf("%d",&sum[i]); sum[i]+=sum[i-1]; } q[++tail]=0; for(int i=1; i<=n; i++) { while(head
<=sum[i]*fenmu(q[head+1],q[head])) head++; dp[i]=getdp(i,q[head]); while(head
<=fenzi(q[tail],q[tail-1])*fenmu(i,q[tail])) tail--; q[++tail]=i; } printf("%d\n",dp[n]); } return 0;}

  

 

转载于:https://www.cnblogs.com/SDUTNING/p/10243386.html

你可能感兴趣的文章
java IO(二):字节流
查看>>
单变量微积分学习笔记
查看>>
Visual Studio下运行PowerShell脚本自增小版本号并发布到Nuget服务器上
查看>>
内行看门道:看似“佛系”的《QQ炫舞手游》,背后的音频技术一点都不简单...
查看>>
windows安装centos7子系统
查看>>
win10下搭建jz2440v3(arm s3c2440)开发及gdb调试环境【转】
查看>>
安装 Percona XtraBackup 2.3
查看>>
Linux网络编程“惊群”问题总结
查看>>
002-redis-数据类型
查看>>
mysql 锁的现象和解决
查看>>
py 行者 the5fire
查看>>
小型网络存储服务器(转)
查看>>
Ext DeskTop的使用方法简易教程及相关例子Demo(转)
查看>>
KD Tree
查看>>
[Cocoa]XCode下的iOS单元测试
查看>>
Centos 中使用 FTP 命令时出现“-bash: ftp: command not found”
查看>>
控件-TextField、Slider、
查看>>
java中ArrayList 、LinkList区别
查看>>
C#怎么做系统托盘
查看>>
ORA-01940: 无法删除当前连接的用户
查看>>