HDU3507 print artical
题目大意:有N个数字a[N],每输出连续的一串,它的费用是 “这行数字的平方加上一个常数M”。问如何输出使得总费用最小。(n<=500000)
分析:动态规划方程为:dp[i]=dp[j]+M+(sum[i]-sum[j])^2;
右边有一项为:sum[i]*sum[j]。考虑用单调队列。
令dp[i]=g,dp[j]+M+sum[i]^2+sum[j]^2=y,sum[j]=y,2*sum[i]=k
则上式变为g=y-kx,即y=kx+g。此为直线方程。
我们要使得g最小,即可以考虑有一条斜率为k的直线自下向上平移,设它接触到的第一个点为(xp,yp),则p为最佳决策点,所以最佳决策点的集合构成了一个下凸包的形状。又因为斜率k是2*sum[i],随着i的递增,斜率k是递增的,所以凸包中的点具备单调性,可以使用单调队列来优化。
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 500005
int n,m,t,head,tail,arr[MAXN];
int f[MAXN],sum[MAXN];
int st[MAXN];
bool turnleft(int i,int j,int k)
{
int y1=f[i]+sum[i]*sum[i]-f[j]-sum[j]*sum[j];
int y2=f[j]+sum[j]*sum[j]-f[k]-sum[k]*sum[k];
int x1=(sum[i]-sum[j]);
int x2=(sum[j]-sum[k]);
if(x2*y1>x1*y2)return 1;
else return 0;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&arr[i]);
sum[i]=sum[i-1]+arr[i];
}
f[0]=0;//arr[1]*arr[1]+m;
head=tail=1;
st[tail++]=0;
for(int i=1;i<=n;i++)
{
int k;
for(;head<tail-1;)
{
if(f[st[head+1]]+sum[st[head+1]]*sum[st[head+1]]-f[st[head]]-sum[st[head]]*sum[st[head]]>2*sum[i]*(sum[st[head+1]]-sum[st[head]]))
break;
else head++;
}
k=st[head];
f[i]=f[k]+(sum[i]-sum[k])*(sum[i]-sum[k])+m;
while(head<tail-1&&(turnleft(i,st[tail-1],st[tail-2])==0))
{
tail--;
}
st[tail++]=i;
}
printf("%d\n",f[n]);
memset(sum,0,sizeof sum);
memset(f,0,sizeof f);
memset(st,0,sizeof st);
}
return 0;
}
HDU3507 print artical的更多相关文章
- HDU3507 Print Article —— 斜率优化DP
题目链接:https://vjudge.net/problem/HDU-3507 Print Article Time Limit: 9000/3000 MS (Java/Others) Mem ...
- hdu3507 Print Article(斜率DP优化)
Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it ...
- hdu3507 Print Article
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) P ...
- hdu3507 Print Article[斜率优化dp入门题]
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- hdu3507 Print Article(斜率优化入门)(pascal)
Problem Description Zero has an old printer that doesn't work well sometimes. As it is antique, he s ...
- HDU3507 Print Article(斜率优化dp)
前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs. ...
- HDU3507 Print Article (斜率优化DP基础复习)
pid=3507">传送门 大意:打印一篇文章,连续打印一堆字的花费是这一堆的和的平方加上一个常数M. 首先我们写出状态转移方程 :f[i]=f[j]+(sum[i]−sum[j])2 ...
- HDU-3507 Print Article (斜率优化)
题目大意:将n个数分成若干个区间,每个区间的代价为区间和的平方加上一个常数m,求最小代价. 题目分析:定义状态dp(i)表示前 i 个数已经分好的最小代价,则状态转移方程为 dp(i)=min(dp( ...
- 2018.08.29 hdu3507 Print Article(斜率优化dp)
传送门 这应该算是斜率优化的模板题了. 就是要求打印n个数,每个数有一个参数a[i],每打印一段连续的数[l,r]需要的花费是(a[[l]+...+a[r])2+m" role=" ...
随机推荐
- jquery 下了框
//选中特定值 $("#Select_GBType").attr("value", "选中项ID"); //获取选中项的值 $(" ...
- 启动hadoop
1.启动前先将主节点下hadoop-2.2.0/hdfs/下,清空,然后新建name文件夹 2.将从节点下hadoop-2.2.0/hdfs/下,清空,然后新建data文件夹 3.hadoop-2.2 ...
- Sprint第二个冲刺(第五天)
一.Sprint 计划会议: 容杰龙继续完善昨天的SQLite修改数据操作,待全部操作完善后交给炜杰进行布局规范和整合. 二.Sprint周期: 看板: 燃尽图:
- Codeforces Round #366 (Div. 2) A
A. Hulk time limit per test 1 second memory limit per test 256 megabytes input standard input output ...
- safari穿越到chrome
tell application "Safari" set theURL to URL of front document set the clipboard to theURL ...
- CSS控制文本自动换行
1.你定死表格的宽度,即给表格一个宽度值(是数值,不是百分比) 2.强制不换行 div{ //white-space:不换行;normal 默认;nowrap强制在同一行内显示所有文本,直到文本结束或 ...
- c 函数及指针学习 10
标准库函数 1算数运算stdlib.h 2随机数stdlib.h 3字符串转化stdlib.h 4数学函数 math.h 5日期和时间 time.h 6信号 signal.h 7打印可变参数列表std ...
- Codeforces Round #131 (Div. 2)
A. System of Equations \(a\)的范围在\(\sqrt n\)内,所以暴力枚举即可. B. Hometask 需要被2.5整除,所以末位必然为0,如果0没有出现,则直接返回-1 ...
- Java泛型和链表
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Java语言引 ...
- java编程之:org.apache.commons.lang3.text.StrTokenizer
第一个api测试:按特殊符号进行分词,并遍历每一个分词部分 public static void main(String[] args) { String aString="AB-CD-EF ...