题目链接

题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费。

思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上的资料,看得还挺懂的,不过我觉得如果以后真遇到斜率DP,要推起来肯定不简单。。。。。

网上资料1

网上资料2

 1 #include <iostream>
 2 #include <stdio.h>
 3
 4 using namespace std;
 5
 6 int q[500005],dp[500005],sum[500005] ;
 7 int head,tail,m,n ;
 8
 9 // dp[i]= min{ dp[j]+M+(sum[i]-sum[j])^2 };
10 int getDP(int i,int j)
11 {
12     return dp[j] + m + (sum[i]-sum[j]) * (sum[i]-sum[j]) ;
13 }
14 int getUP(int j,int k)//求yj-yk
15 {
16     return dp[j]+sum[j]*sum[j]-(dp[k]+sum[k]*sum[k]) ;
17 }
18 int getDOWM(int j,int k)//求xj-xk
19 {
20     return 2*sum[j]-2*sum[k] ;
21 }
22
23 int main()
24 {
25     while(~scanf("%d %d",&n,&m))
26     {
27         for(int i = 1 ; i <= n ; i++)
28             scanf("%d",&sum[i]) ;
29         sum[0] = dp[0] = 0 ;
30         for(int i = 1 ; i <= n ; i++)
31             sum[i] += sum[i-1] ;
32         head = tail= 0 ;
33         q[tail++] = 0 ;
34         for(int i = 1 ; i <= n ; i++)
35         {
36             //如果满足g[j,k]=yj-jk/xj-xk<sum[i]代表这j的决策比k的决策要更优,所以k可以直接淘汰了。
37             while(head+1 < tail && getUP(q[head+1],q[head]) <= sum[i] * getDOWM(q[head+1],q[head]))
38             head++ ;
39             dp[i] = getDP(i,q[head]) ;
40             //g[i,j]<g[j,k],那么j点便永远不可能成为最优解,可以直接将它踢出我们的最优解集。
41             while(head+1 < tail && getUP(i,q[tail-1]) * getDOWM(q[tail-1],q[tail-2]) <= getUP(q[tail-1],q[tail-2]) * getDOWM(i,q[tail-1]))
42                 tail-- ;
43             q[tail++] = i ;
44         }
45         printf("%d\n",dp[n]) ;
46     }
47     return 0;
48 }

View Code

转载于:https://www.cnblogs.com/luyingfeng/p/3712575.html

HDU 3507 Print Article(斜率优化DP)相关推荐

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

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

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

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

  3. HDU-3507Print Article 斜率优化DP

    学习:https://blog.csdn.net/bill_yang_2016/article/details/54667902 HDU-3507 题意:有若干个单词,每个单词有一个费用,连续的单词组 ...

  4. hdu 3507 Print Article(dp+斜率优化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题解:显然这题的递推很容易得到 dp[i]=dp[j]+(sum[i]-sum[j])^2+m ...

  5. HDU 3507 Print Article(单调队列)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3507 题意:给出一个数列C,一个数字M,将数列分成若干段,每段的代价为(设这段的数字为k个): 求一种 ...

  6. HDU 2993 MAX Average Problem(斜率优化DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2993 题目大意:给定一个长度为n(最长为10^5)的正整数序列,求出连续的最短为k的子序列平均值的最大 ...

  7. 【洛谷3648】[APIO2014] 序列分割(斜率优化DP)

    点此看题面 大致题意: 你可以对一个序列进行\(k\)次分割,每次得分为两个块元素和的乘积,求总得分的最大值. 区间\(DPor\)斜率优化\(DP\) 这题目第一眼看上去感觉很明显是区间\(DP\) ...

  8. 逊哥dp专题 总结(普通dp,斜率优化dp,数位dp)

    dp真是博大精深,本渣自叹智商不足,但是就算是不足也要拼死一搏,怒燃之 poj 3934 题意:给你n个身高都不同的人,然后排队,如果两人之间的所有人都比他们俩矮,那么他们俩可以互相看见,问你如果要正 ...

  9. NOI2007 货币兑换 - CDQ分治斜率优化dp

    斜率优化dp维护一个凸壳.如果\(x, y\)坐标都递增,可以用单调队列,如果只有\(x\)递增,可以在凸壳上二分斜率,如果\(x, y\)都不递增,则需要在凸包中插入,可以用平衡树或cdq分治维护. ...

最新文章

  1. 数据如何从HBase读到MR
  2. 有一段时间没来这里了,
  3. wireshark 抓包显示 TCP segment of a reassembled PDU的问题
  4. python os.system执行shell 命令
  5. mysql 字符串的处理
  6. MySQL——修改root密码的4种方法(以windows为例)
  7. Android 音频录制和播放问题
  8. JSP的生命周期研究
  9. (11)python里面while到底有多少知识点
  10. 【渝粤教育】国家开放大学2018年秋季 0630-22T环境法学 参考试题
  11. 《Python Cookbook 3rd》笔记(5.8):固定大小记录的文件迭代
  12. 程序员面试金典 - 面试题 05.08. 绘制直线(位运算)
  13. baq在聊天中啥意思_职场中的“老实人”如何实现逆袭,得到领导的重用?
  14. 《深度学习笔记》——loss函数的学习笔记
  15. 测试es from size error,from + size must be less than or equal to: [10000]异常问题
  16. 1. Xamarin开发入门
  17. 对比无源蜂鸣器和有源蜂鸣器
  18. 《专业主义》阅读摘要——作者:大前研一
  19. 程序员的量化交易之路(22)--Cointrader值货币集合Currencies(10)
  20. java代码打出一只狗_牛逼!这位程序员开发出一“舔狗”必备神器(代码已开源)!...

热门文章

  1. Java8--Lambda表达式对List集合操作
  2. C语言再学习 -- 内存管理
  3. 2017-9-17pat甲级 B
  4. YOLO-目标检测中计算AP、MAP方法
  5. Android微信自动回复功能
  6. 三星t800Android 6.0,6.6毫米品质平板 三星GALAXY Tab S发布
  7. JZOJ 5938. 【NOIP2018模拟10.30】分离计划
  8. java同名类_java两个不同名类 在里面建立两个同名的类 怎么破
  9. mysql中find_in_set_mysql中find_in_set()函数的使用详解
  10. matlab您的安装可能需要执行其他配置步骤_手把手超详细介绍MATLAB+RoadRunner+Unreal Engine自动驾驶联合仿真...