传送门

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

就是要求打印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. VB6 内存释放

    VB在内存释放方面是这样的, 首先和其他任何语言一样,如果是在stack分配的空间的话,操作系统自动进行管理 比如下面的语句 dim a as string '当a 超出它的作用范围以后,就会被释放掉 ...

  2. CentOS Tomcat启动 Neither the JAVA_HOME nor the JRE_HOME environment variable is defined

    链接:http://blog.csdn.net/shangdiyisi/article/details/9477521 [bravoinfo@bravoinfo-hk-01 apache-tomcat ...

  3. c语言使用librdkafka库实现kafka的生产和消费实例(转)

    关于librdkafka库的介绍,可以参考kafka的c/c++高性能客户端librdkafka简介,本文使用librdkafka库来进行kafka的简单的生产.消费 一.producer librd ...

  4. chattr与lsattr命令

    这两个命令是用来查看和改变文件.目录属性的,与chmod这个命令相比,chmod只是改变文件的读写.执行权限,更底层的属性控制是由chattr来改变的. chattr命令的用法:chattr [ -R ...

  5. Haskell语言学习笔记(65)Data.HashMap

    安装 unordered-containers $ cabal install unordered-containers Installed unordered-containers-0.2.9.0 ...

  6. c++实现扫雷(坐标)

    昨天在观察贪食蛇的代码时,看到了有如何实现扫雷的c++代码,觉得挺有趣,今天便又试了一下 #include <ctime> #include <cstdlib> #includ ...

  7. 协同过滤 spark scala

    1 http://www.cnblogs.com/charlesblc/p/6165201.html [转载]协同过滤 & Spark机器学习实战 2 基于Spark构建推荐引擎之一:基于物品 ...

  8. Linux就业技术指导(六):天津IDC机房项目实践

    一,天津IDC机房项目图片介绍 服务器DELL R720 二,远程控制卡配置方法 远程控制卡,在服务器没有装操作系统或者操作系统出问题了.用户可以通过连接到远程控制卡来连接服务器,就如同切换到我们的虚 ...

  9. Bean Validation技术实现对Javabean的校验

    概述:在java开发时,由于分层的原因(表现层-控制层-业务层-数据持久层),有时候需要对传入的Javabean进行校验,如果过多的校验会导致比较繁琐,做重复的工作,下面将介绍Bean Validat ...

  10. eclipse搭建struts2环境及所遇到的问题

    最近几天一直在搭建struts2框架,本身struts2框架的搭建是非常简单的,但不知道为什么最近就是总是报错,报了一大串的错 首先就是每次在类的根路径下创建struts.xml时,就报错,也不知道为 ...