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 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...
随机推荐
- 扩展欧几里得原理的应用:POJ1061青蛙的约会
/* POJ 1061: 青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 123709 Accepted: 26395 ...
- DataWorks2.0的“业务流程”与1.0的“工作流”的对比
DatwWorks终于升级2.0了,心情万分激动之余,又有一丝担忧.因为,没法再创建新的旧版工作流了...新版抛弃了“工作流”这个概念,引入了“业务流程”和“解决方案”两个新的概念.于是,作为团队Le ...
- PHP setrawcookie() 函数
定义和用法 setrawcookie() 函数不对 cookie 值进行 URL 编码,发送一个 HTTP cookie. cookie 是由服务器发送到浏览器的变量.cookie 通常是服务器嵌入到 ...
- NX二次开发-UFUN批量操作图层状态UF_LAYER_set_many_layers_status
NX11+VS2013 #include <uf.h> #include <uf_ui.h> #include <uf_layer.h> UF_initialize ...
- js Date.parse() format.
date format android chrome linux chrome Mobile safari ios chrome windows safari linux firefox window ...
- OAuth2.0的理解-转自阮一峰博客
一.应用场景 为了理解OAuth的适用场合,让我举一个假设的例子. 有一个"云冲印"的网站,可以将用户储存在Google的照片,冲印出来.用户为了使用该服务,必须让"云冲 ...
- 如何用javascript高效的判断浏览器种类和版本
<script type="text/javascript"> var Sys = {}; var ua = navigator.userA ...
- Round Numbers /// 组合计数 oj21455
题目大意: 给定a,b 输出[a,b]的闭区间中round number的数量 所谓round就是一个数在二进制下0的个数大于等于1的个数 0的个数>=1的个数 也就是1的个数<=0的个数 ...
- 4、Docker网络访问
现在我们已经可以熟练的使用docker命令操作镜像和容器,并学会了如何进入到容器中去,那么实际的工作中,我们通常是在Docker中部署服务,我们需要在外部通过IP和端口进行访问的,那么如何访问到Doc ...
- 常见的arp欺骗
三.常见ARP欺骗形式 1.假冒ARP reply包(单播) XXX,I have IP YYY and my MAC is ZZZ! 2.假冒ARP reply包(广播) Hello everyon ...