Zero has an old printer that doesn't work well sometimes. As it is antique, he still like to use it to print articles. But it is too old to work for a long time and it will certainly wear and tear, so Zero use a cost to evaluate this degree. 
One day Zero want to print an article which has N words, and each word i has a cost Ci to be printed. Also, Zero know that print k words in one line will cost 

M is a const number. 
Now Zero want to know the minimum cost in order to arrange the article perfectly. 

InputThere are many test cases. For each test case, There are two numbers N and M in the first line (0 ≤ n ≤ 500000, 0 ≤ M ≤ 1000). Then, there are N numbers in the next 2 to N + 1 lines. Input are terminated by EOF.OutputA single number, meaning the mininum cost to print the article.Sample Input

5 5
5
9
5
7
5

Sample Output

230

应该是初步get了,由于以前看到的博主的配图和用语有误,让人再混沌之中浮尸了好久,头疼,应该是这样的图。

wa,我自己画的,将就辣。

开始学的时候感觉好抽象啊,还特意去学了瞎‘凸包’专题,QwQ,这里主要是解释一下‘为什么’。

初学感悟:

零:我们把线段的两个端点叫做点对,把dp[j]+(sum[i]-sum[j])^2取得最小的是j叫做i的最优点。

一:一对点对里,前面的点和后面的点的优劣关系由sum i决定,但是删去前劣后优的点后,剩下的就是前由后劣,得到i时的队首最优。

Ω,本来的点对满足k=(y1-y2)/(x1-x2) > sum[i],由于sum i是递增的,后面这个不等关系可能会改变。即此时(i==n时)队首是最优点,但是当i>n时,可能存在k<sum[i],这也是为什么我们需要每个i维护队首元素,使得队首是最优点。

二:我们维护的是一个斜率上升的图形,1,2,3,4代表的是队列里的点,求dp i时有4步:

α,  对队首:斜率k(1,2)和sum i 的关系不再得到满足,说明对于i点,队首1已经不如队首2优,抛弃1,依此后推...

β,  dp i= dp q[top]+...

γ,   对队尾:具体的如果我们要加入一点5,如果斜率k(4,5)<k(3,4),4点被抛弃:不等式(yj-yk)/(xj-xk) <= sum[i],由于sum i递增,此时小于等于,即删去的点对i不会最优,对后面的i+更不会...

ε,   i入队尾,由于删去γ中不满足的点后,加入后满足图像斜率依旧上升。

三:为什么i的最优值在队首取得?

ζ, 见一,删去前劣后优的点后,剩下的就是前由后劣,队首为最优点。

四:注意整理中要考虑下正负,涉及到不等号的方向,当然此题毋须多虑。

θ, 把除法转化成乘法;注意符号。

(写法是左开右闭)

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=;
int dp[maxn],sum[maxn],q[maxn];
int n,m;
int getdp(int i,int j)
{
return dp[j]+(sum[i]-sum[j])*(sum[i]-sum[j])+m;
}
int getdy(int i,int j)
{
return dp[i]+sum[i]*sum[i]-dp[j]-sum[j]*sum[j];
}
int getdx(int i,int j)
{
return *(sum[i]-sum[j]);
}
int main()
{
int i,j,n,head,tail;
while(~scanf("%d%d",&n,&m))
{
for(i=;i<=n;i++) scanf("%d",&sum[i]);
for(i=;i<=n;i++) sum[i]+=sum[i-];
head=tail=;q[]=;
for(i=;i<=n;i++){
while(head<tail&&(getdy(q[head+],q[head])<=sum[i]*getdx(q[head+],q[head]))) head++;
dp[i]=getdp(i,q[head]);
while(head<tail&&(getdy(i,q[tail])*getdx(i,q[tail-])<=(getdy(i,q[tail-])*getdx(i,q[tail])))) tail--;
q[++tail]=i;
}
printf("%d\n",dp[n]);
}
return ;
}

HDU3507Print Article (斜率优化DP)的更多相关文章

  1. hdu3507Print Article(斜率优化dp)

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  2. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

  3. HDU3507 Print Article(斜率优化dp)

    前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs. ...

  4. hdu 3507 Print Article(斜率优化DP)

    题目链接:hdu 3507 Print Article 题意: 每个字有一个值,现在让你分成k段打印,每段打印需要消耗的值用那个公式计算,现在让你求最小值 题解: 设dp[i]表示前i个字符需要消耗的 ...

  5. hdu3507 Print Article[斜率优化dp入门题]

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  6. HDU3507 Print Article —— 斜率优化DP

    题目链接:https://vjudge.net/problem/HDU-3507 Print Article Time Limit: 9000/3000 MS (Java/Others)    Mem ...

  7. [hdu3507 Print Article]斜率优化dp入门

    题意:需要打印n个正整数,1个数要么单独打印要么和前面一个数一起打印,1次打印1组数的代价为这组数的和的平方加上常数M.求最小代价. 思路:如果令dp[i]为打印前i个数的最小代价,那么有 dp[i] ...

  8. Print Article /// 斜率优化DP oj26302

    题目大意: 经典题 数学分析 G(a,b)<sum[i]时 a优于b G(a,b)<G(b,c)<sum[i]时 b必不为最优 #include <bits/stdc++.h& ...

  9. HDU3507 Print Article (斜率优化DP基础复习)

    pid=3507">传送门 大意:打印一篇文章,连续打印一堆字的花费是这一堆的和的平方加上一个常数M. 首先我们写出状态转移方程 :f[i]=f[j]+(sum[i]−sum[j])2 ...

  10. hdu 3507 Print Article —— 斜率优化DP

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3507 设 f[i],则 f[i] = f[j] + (s[i]-s[j])*(s[i]-s[j]) + m ...

随机推荐

  1. C++添加简单的日记记录

    #include<fstream>#include<iostream> using namespace std;//这是一种日记记录 b 种void LOG(char *tx, ...

  2. 32位JDK和64位JDK

    32位和64位系统在计算机领域中常常提及,但是仍然很多人不知道32位和64位的区别,所以本人在网上整理了一些资料,并希望可以与大家一起分享.对于32位和64位之分,本文将分别从处理器,操作系统,JVM ...

  3. Nginx 自定义404、500错误页面跳转

    自定义Nginx错误界面跳转 1.开启Nginx.conf配置文件下的自定义接口参数. http { fastcgi_intercept_errors on; } 2.在Server区域添加自定义的错 ...

  4. 2018-2019-2 20165114《网络对抗技术》Exp5 MSF基础应用

    Exp5 MSF基础应用 目录 一.实验目标 二.基础问题回答 三.实验过程记录 3.1主动攻击实践 ms08_067+generic/shell reverse_tcp ms17_010_etern ...

  5. Windows Server 2008 R2服务器遗忘管理员密码解决方案

     A goal is a dream with a deadline. Much effort, much prosperity.  在日常的工作中,对于一个网络管理员来讲最悲哀的事情莫过于在没有备用 ...

  6. EF Code-First 学习之旅 数据库初始化

    1.CreateDatabaseIfNotExists: 2.DropCreateDatabaseIfModelChanges: 3.DropCreateDatabaseAlways: 4.Custo ...

  7. File类之常用方法

    package IoDemo; import java.io.File; import java.io.IOException; /** * @Title:FileTest * @Descriptio ...

  8. jdbc例子

    public class ConnMysql { public static void main(String[] args) throws ClassNotFoundException, SQLEx ...

  9. HIVE- SCD缓慢变化

    SCD缓慢变化维,比如一个用户维表,用户属性会变化,但是不会变化很剧烈,可能一年只会变化一两次,也不会所有用户的属性都会有变化,只有少量的数据发生变化,所以叫缓慢变化维.这种问题就是由于维度的变化所造 ...

  10. ImageView显示图像控件

    ImageView显示图像控件 一.简介 1. 2. ImageView,图像视图,直接继承自View类,它的主要功能是用于显示图片,实际上它不仅仅可以用来显示图片,任何Drawable对象都可以使用 ...