Print Article /// 斜率优化DP oj26302
题目大意:
#include <bits/stdc++.h>
#define N 500005
using namespace std;
int n,m,dp[N],deq[N],sum[N];
// deq[]为单调队列 sum[]为数组的前缀和
int DP(int i,int j) {
return dp[j]+m+(sum[i]-sum[j])*(sum[i]-sum[j]);
}
int UP(int j,int k) { //yj-yk的部分
return dp[j]+sum[j]*sum[j]-(dp[k]+sum[k]*sum[k]);
}
int DOWN(int j,int k) {//xj-xk的部分
return *(sum[j]-sum[k]);
}
/*
由分析 当0<a<b<i时
若(ya-yb)/(xa-xb)<sum[i]
此处表达为G(a,b)<sum[i] 则j优于k 若存在a,b和b,c满足上述要求
即存在G(a,b)<sum[i] G(b,c)<sum[i]
若G(a,b)<G(b,c) 则b肯定不为最优点
*/
int main()
{
while(~scanf("%d%d",&n,&m)) {
sum[]=dp[]=;
for(int i=;i<=n;i++) {
int num; scanf("%d",&num);
sum[i]=sum[i-]+num;
}
int head=, tail=;
deq[tail++]=;
for(int i=;i<=n;i++) {
while(head+<tail && UP(deq[head+],deq[head])<=sum[i]
*DOWN(deq[head+],deq[head]))
head++; /// G(head+1,head)<=sum[i] 即head+1优于head 则去掉head
dp[i]=DP(i,deq[head]); // 用此时的最优head更新dp[i]
while(head+<tail && UP(i,deq[tail-])*DOWN(deq[tail-],deq[tail-])
<=DOWN(i,deq[tail-])*UP(deq[tail-],deq[tail-]))
tail--;
/// 如果此时G(i,tail-1)<=G(tail-1,tail-2)<=sum[i] 则说明tail-1对应点为可删去
deq[tail++]=i;
}
printf("%d\n",dp[n]);
}
return ;
}
/*
纠结了一下维护单调队列时为什么判断条件是<=
第一处 G(head+1,head)=sum[i] 说明 两者平等 不存在谁更优这个问题
而仍然 head++; 是因为既然两者平等 那么只要留一个就可以了
第二处 G(i,tail-1)=G(tail-1,tail-2) 说明 两者斜率相等
即 i,tail-1,tail-2 三个对应点在同一条直线上
那么 tail-1 这个点可以直接忽略 所以继续 tail--;
*/
Print Article /// 斜率优化DP oj26302的更多相关文章
- HDU3507 Print Article(斜率优化dp)
前几天做多校,知道了这世界上存在dp的优化这样的说法,了解了四边形优化dp,所以今天顺带做一道典型的斜率优化,在百度打斜率优化dp,首先弹出来的就是下面这个网址:http://www.cnblogs. ...
- hdu 3507 Print Article(斜率优化DP)
题目链接:hdu 3507 Print Article 题意: 每个字有一个值,现在让你分成k段打印,每段打印需要消耗的值用那个公式计算,现在让你求最小值 题解: 设dp[i]表示前i个字符需要消耗的 ...
- hdu3507 Print Article[斜率优化dp入门题]
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- HDU3507 Print Article —— 斜率优化DP
题目链接:https://vjudge.net/problem/HDU-3507 Print Article Time Limit: 9000/3000 MS (Java/Others) Mem ...
- [hdu3507 Print Article]斜率优化dp入门
题意:需要打印n个正整数,1个数要么单独打印要么和前面一个数一起打印,1次打印1组数的代价为这组数的和的平方加上常数M.求最小代价. 思路:如果令dp[i]为打印前i个数的最小代价,那么有 dp[i] ...
- HDU3507 Print Article (斜率优化DP基础复习)
pid=3507">传送门 大意:打印一篇文章,连续打印一堆字的花费是这一堆的和的平方加上一个常数M. 首先我们写出状态转移方程 :f[i]=f[j]+(sum[i]−sum[j])2 ...
- 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 ...
- hdu3507Print Article(斜率优化dp)
Print Article Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)To ...
- HDU-3507Print Article 斜率优化DP
学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...
随机推荐
- 【代码工具】Lombok来优雅的编码
前言 Lombok 是一种 Java™ 实用工具,可用来帮助开发人员消除 Java 的冗长,尤其是对于简单的 Java 对象(POJO).它通过注解实现这一目的. 正文 添加依赖 在 pom.xml ...
- zjoi 2008 树的统计——树链剖分
比较基础的一道树链剖分的题 大概还是得说说思路 树链剖分是将树剖成很多条链,比较常见的剖法是按儿子的size来剖分,剖分完后对于这课树的询问用线段树维护——比如求路径和的话——随着他们各自的链向上走, ...
- 矩阵乘法分配律+bitset优化——hdu4920
因为是模3,所以把原矩阵拆成两个01矩阵,然后按分配律拆开分别进行矩阵乘法,行列用bitset来存进行优化即可 注意 int bitset<int>::count() 函数可以统计bits ...
- jar中没有主清单属性【解决办法】
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compi ...
- POJ3436:ACM Computer Factory-最大流
目录 目录 思路: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 目录 题意:传送门 原题目描述在最下面. 题目真难读懂 有\(n\)台机器,每台机器有\(p\)个部分,每台机 ...
- spring 配置bean以及配置依赖 (2)
目录 一.使用ref引用其他对象 二.通过有参构造器创建对象 1 通过index精确定位参数顺序 三.引用bean 1 使用内部bean 2 使用list,set 3 声明集合类型 四.其他 1 使用 ...
- 如何理解CUDA中的cudaMalloc()的参数
首先看下此运行时函数的原型: cudaError_t cudaMalloc (void **devPtr, size_t size ); 主要的第一个参数.为什么是两个星星呢?用个例子来说明下. fl ...
- 关于js私钥加密公钥解密的问题
博客荒废很久了,最近遇到一个问题,看网上的说明比较少,所以写下来给大家一个参考 一般来说rsa算法都是使用公钥加密,私钥解密,或者私钥签名,公钥验签.但总有特别的时候会想要用私钥加密,公钥解密,但是j ...
- iOS开发系列-Shell脚本生成IPA
概述 在公司开发到了测试阶段需要频繁打包交付给测试,看似简单的工作,重复的流程总是感觉不是那么好,我们可以借助苹果提供的编译指令编译项目. 自动化脚本编译打包IPA 常见的iOS项目就是基于xcode ...
- CSS在工程中改变之面向对象的 CSS
oocss的概念 众多开发者忽视了css的表现(认为它) oocss将页面可重用的元素抽象成一个类,用class加以描述,而与其对应的HTML即可看成是此类的一个实例. oocss的作用 1.加强代码 ...