传送门

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

就是要求打印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. eclipse 乱码

    svn乱码: 教你解决Eclipse中SVN比较乱码问题 workspace->utf-8设置后成功! console乱码: 项目右键 :  run as configuration 设置com ...

  2. CStatic控件SS_NOTIFY属性

    SS_NOTIFY Sends the parent window STN_CLICKED, STN_DBLCLK, STN_DISABLE, and STN_ENABLE notification ...

  3. Eclipse安装Svn无法连接问题

    在Eclipse市场上安装完SVN插件后连接SVN时出现以下错误: SVN: '0x00400006: Validate Repository Location' operation finished ...

  4. (4)shiro多个realm

    shiro支持多个realm,当设置多个realm的时候,shiro的认证和授权的步骤是怎样的呢. 多个realm认证原理: 发现需要在执行认证的时候,需要策略来处理多个realm存在的情况.默认实现 ...

  5. Delphi声明Record变量后直接初始化

    TARec = record    A1: string;    A2: string;  end; TBRec = record    A1: string;    A2: string;    A ...

  6. 全面解析PHP面向对象的三大特征

    PHP面向对象的三大特征: 继承,封装,多态 一.继承 1.如何实现继承? 给子类使用extends关键字,让子类继承父类: class Student extends Person{} 2.实现继承 ...

  7. StringBuild的一个小问题

    今天在项目开发的过程中写了一小段代码: sb_result.AppendFormat("{\"SmsmTaskModeName\":\"{0}\",\ ...

  8. mesos无执行器启动docker

    生成taskInfo task = mesos_pb2.TaskInfo() task_id = name task.task_id.value = task_id task.slave_id.val ...

  9. <a>, <input>, <button>的区分与何时使用

    像 button 的原始目的就是一个通用的按钮,点击后应该触发 JavaScript, 没有其它附带的隐含的附加效果,<a> 标签的隐含附带效果就是跳转页面到其它地方,而提交表单时应该有一 ...

  10. hdoj Max Sum Plus Plus(DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 题意:----最大M子段和问题给定由 n个整数(可能为负整数)组成的序列a1,a2,a3,……, ...