传送门

这应该算是斜率优化的模板题了。

就是要求打印n个数,每个数有一个参数a[i],每打印一段连续的数[l,r]需要的花费是(a[[l]+...+a[r])2+m" role="presentation" style="position: relative;">(a[[l]+...+a[r])2+m(a[[l]+...+a[r])2+m,要使得打印出所有数的代价最小。

用dp[i]表示打印1~i用的最小代价,显然有dp[i]=min(dp[j]+m+(sum[i]−sum[j−1])2)" role="presentation" style="position: relative;">dp[i]=min(dp[j]+m+(sum[i]−sum[j−1])2)dp[i]=min(dp[j]+m+(sum[i]−sum[j−1])2),对于两个不同的决策j,k(j>k),如果j比k优可以得到一个不等式,将它表示成一个斜率的形式发现维护这个斜率的单调性就可以O(1)转移了。

代码:

#include<bits/stdc++.h>
#define N 500005
using namespace std;
int f[N],q[N],sum[N],hd,tl,n,m;
inline int calc(int a,int b){return f[b]+m+(sum[a]-sum[b])*(sum[a]-sum[b]);}
inline int checky(int a,int b){return f[a]+sum[a]*sum[a]-f[b]-sum[b]*sum[b];}
inline int checkx(int a,int b){return (sum[a]-sum[b])*2;}
int main(){
    while(scanf("%d%d",&n,&m)==2){
        sum[0]=f[0]=0;
        for(int i=1;i<=n;++i)scanf("%d",&sum[i]),sum[i]+=sum[i-1];
        hd=0,tl=1,q[0]=0;
        for(int i=1;i<=n;++i){
            while(hd+1<tl&&checky(q[hd+1],q[hd])<=sum[i]*checkx(q[hd+1],q[hd]))++hd;
            f[i]=calc(i,q[hd]);
            while(hd+1<tl&&checky(i,q[tl-1])*checkx(q[tl-1],q[tl-2])<=checky(q[tl-1],q[tl-2])*checkx(i,q[tl-1]))--tl;
            q[tl++]=i;
        }
        cout<<f[n]<<'\n';
    }
    return 0;
}

2018.08.29 hdu3507 Print Article(斜率优化dp)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. 2018.09.29 bzoj3156: 防御准备(斜率优化dp)

    传送门 斜率dp经典题目. 然而算斜率的时候并没有注意到下标的平方会爆int于是咕咕*2. 这道题我用了两个数组来表示状态. f[i]f[i]f[i]表示最后i个位置倒数第i个放木偶的最优值. g[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. 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. springMVC获取用户的数据

    打算记录网站的访问信息,没有眉目,下记下参考. SpringMVC-获得用户请求数据

  2. sitemap

    sitemap对于网站就像是字典的索引目录,而这个目录的读者则是搜索引擎的爬虫.网站有了sitemap,有助于搜索引擎“了解”网站,这样会有助于站点的内容被收录. sitemap是一个由google主 ...

  3. Supervisor 进程管理工具

    简介: Supervisor 进程管理工具 一.安装 shell > yum -y install python-pip shell > pip install supervisor # ...

  4. TEXT 6 Travelling with baggage

    TEXT 6 Travelling with baggage 背着行囊去旅行 Feb 16th 2006 From The Economist print edition (1)FEW modern ...

  5. base和this

    base//只能继承其直接基类成员 常用于对象初始化时和基类通信1.base局限于构造函数.实例方法.实例属性访问其中2.base调用直接基类已被重写的方法,或者所有父类的非重载方法3.base制定创 ...

  6. struts2 自带的 token防止表单重复提交拦截器

    在struts2中,我们可以利用struts2自带的token拦截器轻松实现防止表单重复提交功能! 1. 在相应的action配置中增加:  <interceptor-ref name=&quo ...

  7. Numpy统计

    Numpy统计 axis=None 是统计函数的标配参数,默认不输入此参数则为对数组每一个元素进行计算,设定轴则对此轴上元素进行计算 1:常用统计函数 .sum(a,axis=None):数组a求和运 ...

  8. BIGDECIMAL 四舍五入等取舍问题

    我输入的是1.35,但是电脑不可能取到整数,他的值如下:初始化数据:1.350000000000000088817841970012523233890533447265625ROUND_DOWN); ...

  9. conductor介绍

    https://netflix.github.io/conductor/ https://github.com/Netflix/conductor 编译版: https://jcenter.bintr ...

  10. Web标准:七、横向导航菜单

    Web标准:七.横向导航菜单 知识点: 1.横向列表菜单 2.用图片美化的横向导航 3.css Sprites   1)横向列表菜单 可以在第四节课的基础上来实现横向导航菜单,只要给li一个float ...