【BZOJ3437】小P的牧场,斜率优化DP
2016-04-29 15:22
357 查看
传送门
写在前面:感觉线性基太蛋疼了
思路:
原始方程
f[i]=min(f[j]+∑ik=j+1b[k]∗(i−k)+a[i])j∈[0,i)
用前缀和优化
f[i]=min(f[j]+i∗(sum1[i]−sum1[j])−(sum2[i]−sum[j])+a[i])
其中sum1[x]=∑xi=1b[i],sum2[x]=∑xi=1b[i]∗i
复杂度O(n2)
设x>y且x转移i比y转移i优,则有
(f[x]+sum2[x]−f[y]−sum2[y])sum1[x]−sum1[y]<i
注意:数据范围不全,a,b也属于long long范围
代码:
写在前面:感觉线性基太蛋疼了
思路:
原始方程
f[i]=min(f[j]+∑ik=j+1b[k]∗(i−k)+a[i])j∈[0,i)
用前缀和优化
f[i]=min(f[j]+i∗(sum1[i]−sum1[j])−(sum2[i]−sum[j])+a[i])
其中sum1[x]=∑xi=1b[i],sum2[x]=∑xi=1b[i]∗i
复杂度O(n2)
设x>y且x转移i比y转移i优,则有
(f[x]+sum2[x]−f[y]−sum2[y])sum1[x]−sum1[y]<i
注意:数据范围不全,a,b也属于long long范围
代码:
#include<bits/stdc++.h> #define LL long long #define M 1000003 using namespace std; LL in() { LL t=0;char ch=getchar(); while (ch<'0'||ch>'9') ch=getchar(); while (ch>='0'&&ch<='9') t=(t<<3)+(t<<1)+ch-48,ch=getchar(); return t; } int n,head=1,tail=1,q[M]; LL a[M],b[M],f[M],sum1[M],sum2[M]; double Get(int x,int y) { return (double)(f[x]+sum2[x]-f[y]-sum2[y])/(double)(sum1[x]-sum1[y]); } main() { n=in(); for (int i=1;i<=n;i++) a[i]=in(); for (int i=1;i<=n;i++) b[i]=in(), sum1[i]=sum1[i-1]+b[i], sum2[i]=sum2[i-1]+b[i]*i; for (int i=1;i<=n;i++) { while (head<tail&&Get(q[head+1],q[head])<i) head++; f[i]=f[q[head]]+(sum1[i]-sum1[q[head]])*i-(sum2[i]-sum2[q[head]])+a[i]; while (head<tail&&Get(i,q[tail])<Get(q[tail],q[tail-1])) tail--; q[++tail]=i; } printf("%lld",f ); }
相关文章推荐
- 关于java单例模式实现
- This Handler class should be static or leaks might occur Android
- ThreadLocal
- uva10328(递推)
- 如何取消或定制当点击GridView 的时候出现的那个黄色背景
- BZOJ1071 [SCOI2007]组队
- easyui显示时间格式问题
- 试试博客
- 什么是jQuery?
- Python 中 os.path模板
- 【DirectX11-Tutorial】Initializing Direct3D
- 剑指offer(5) 旋转数组中的最小值
- Mysql接口大全
- scala学习第一弹:基本语法和语法特性
- 内存寻址优化
- swift 的高阶函数的使用代码
- pyqt4 基本窗口,窗口布局,设置logo,窗口最大最小化
- pyinstaller生成exe笔记
- 一个简单python语言web server,输出机器上的HW信息
- MJRefresh的那些坑