bsoj 3733 【模拟试题】打印文章(hdu3507)
2016-04-30 11:12
561 查看
Description
给出N个单词,每个单词有个非负权值Ci,现要将它们分成连续的若干段,每段的代价为此段单词的权值和,还要加一个常数M,即(∑Ci)^2+M。现在想求出一种最优方案,使得总费用之和最小。
Input
包含多组测试数据,对于每组测试数据。第一行包含两个整数N和M(0 <= N <= 500000,0 <= M <= 1000),第二行为N个整数。
Output
输出仅一个整数,表示最小的价值。
Sample Input
5 5
5 9 5 7 5
Sample Output
230
刚学了斜率优化:
F[i]=min(F[j]+(S[i]-S[j])^2)+M;
设j<
G[j]=F[j]+(S[i]-S[j])^2;
假设 G[j]>G[k]
F[j]+(S[i]-S[j])^2>F[k]+(S[i]-S[k])^2
(S[i]-S[j])^2=S[i]^2-2*S[i]*S[j]+S[j]^2
F[j]-F[k]+S[j]^2-S[k]^2>2*S[i]*(S[j]-S[k])
∵S[k]>S[j]
∴(F[j]-F[k]+S[j]^2-S[k]^2)/(S[j]-S[k])<2*S[i];
令Slope[j][k]=(F[j]-F[k]+S[j]^2-S[k]^2)/(S[j]-S[k]);
当Slope[j][k]<2*S[i]时,k比j优
初略算了一下。
好像还行吧.
给出N个单词,每个单词有个非负权值Ci,现要将它们分成连续的若干段,每段的代价为此段单词的权值和,还要加一个常数M,即(∑Ci)^2+M。现在想求出一种最优方案,使得总费用之和最小。
Input
包含多组测试数据,对于每组测试数据。第一行包含两个整数N和M(0 <= N <= 500000,0 <= M <= 1000),第二行为N个整数。
Output
输出仅一个整数,表示最小的价值。
Sample Input
5 5
5 9 5 7 5
Sample Output
230
刚学了斜率优化:
F[i]=min(F[j]+(S[i]-S[j])^2)+M;
设j<
G[j]=F[j]+(S[i]-S[j])^2;
假设 G[j]>G[k]
F[j]+(S[i]-S[j])^2>F[k]+(S[i]-S[k])^2
(S[i]-S[j])^2=S[i]^2-2*S[i]*S[j]+S[j]^2
F[j]-F[k]+S[j]^2-S[k]^2>2*S[i]*(S[j]-S[k])
∵S[k]>S[j]
∴(F[j]-F[k]+S[j]^2-S[k]^2)/(S[j]-S[k])<2*S[i];
令Slope[j][k]=(F[j]-F[k]+S[j]^2-S[k]^2)/(S[j]-S[k]);
当Slope[j][k]<2*S[i]时,k比j优
初略算了一下。
好像还行吧.
#include<iostream> #include<iomanip> #include<cstring> #include<cmath> #include<cstdio> using namespace std; long long S[500005]; long long f[500005]; int q[500005]; double Slope(int j,int k){ return (f[j]-f[k]+S[j]*S[j]-S[k]*S[k])*1.0/(S[j]-S[k]); } int main(){ int n; int M; while(scanf("%d",&n)==1){ scanf("%d",&M); int x; for(int i=1;i<=n;i++){ scanf("%d",&x); S[i]=S[i-1]+x; } int l=1;int r=1; f[0]=0;q[1]=0; for(int i=1;i<=n;i++){ while(l<r&&Slope(q[l],q[l+1])<2*S[i])l++; int j=q[l]; f[i]=f[j]+(S[i]-S[j])*(S[i]-S[j])+M; while(l<r&&Slope(q[r-1],q[r])>Slope(q[r],i))r--; q[++r]=i; } printf("%lld\n",f ); } return 0; }
相关文章推荐
- 事件总线 EventBus
- 20145212 《Java程序设计》第9周学习总结
- mysql中使用正则表达式查询
- 58. Android一些开发习惯总结
- button圆角
- button圆角
- nagios 笔记
- php数组分页实现方法
- jQuery 实现Ajax
- Caffe 深度学习框架上手教程
- HTML框架
- C++基础实践指导(上)
- struts2中form提交到action中的中文参数乱码问题解决办法(包括取中文路径)
- 四则运算
- mysql主从复制跳过错误
- HTML DOM Event 对象
- nodejs相关学习资料
- phpstrom 编辑器设置
- spring多种格式日期类型绑定
- poj 3348(求凸包面积)