题目大意:

典题

数学分析 G(a,b)<sum[i]时 a优于b

G(a,b)<G(b,c)<sum[i]时 b必不为最优

  1. #include <bits/stdc++.h>
  2. #define N 500005
  3. using namespace std;
  4. int n,m,dp[N],deq[N],sum[N];
    // deq[]为单调队列 sum[]为数组的前缀和
  5. int DP(int i,int j) {
  6. return dp[j]+m+(sum[i]-sum[j])*(sum[i]-sum[j]);
  7. }
  8. int UP(int j,int k) { //yj-yk的部分
  9. return dp[j]+sum[j]*sum[j]-(dp[k]+sum[k]*sum[k]);
  10. }
  11. int DOWN(int j,int k) {//xj-xk的部分
  12. return *(sum[j]-sum[k]);
  13. }
  14. /*
  15. 由分析 当0<a<b<i时
  16. 若(ya-yb)/(xa-xb)<sum[i]
  17. 此处表达为G(a,b)<sum[i] 则j优于k
  18.  
  19. 若存在a,b和b,c满足上述要求
  20. 即存在G(a,b)<sum[i] G(b,c)<sum[i]
  21. 若G(a,b)<G(b,c) 则b肯定不为最优点
  22. */
  23. int main()
  24. {
  25. while(~scanf("%d%d",&n,&m)) {
  26. sum[]=dp[]=;
  27. for(int i=;i<=n;i++) {
  28. int num; scanf("%d",&num);
  29. sum[i]=sum[i-]+num;
  30. }
  31. int head=, tail=;
  32. deq[tail++]=;
  33. for(int i=;i<=n;i++) {
  34. while(head+<tail && UP(deq[head+],deq[head])<=sum[i]
  35. *DOWN(deq[head+],deq[head]))
  36. head++; /// G(head+1,head)<=sum[i] 即head+1优于head 则去掉head
  37. dp[i]=DP(i,deq[head]); // 用此时的最优head更新dp[i]
  38. while(head+<tail && UP(i,deq[tail-])*DOWN(deq[tail-],deq[tail-])
  39. <=DOWN(i,deq[tail-])*UP(deq[tail-],deq[tail-]))
  40. tail--;
  41. /// 如果此时G(i,tail-1)<=G(tail-1,tail-2)<=sum[i] 则说明tail-1对应点为可删去
  42. deq[tail++]=i;
  43. }
  44. printf("%d\n",dp[n]);
  45. }
  46. return ;
  47. }
    /*
    纠结了一下维护单调队列时为什么判断条件是<=
    第一处 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的更多相关文章

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

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

  2. hdu 3507 Print Article(斜率优化DP)

    题目链接:hdu 3507 Print Article 题意: 每个字有一个值,现在让你分成k段打印,每段打印需要消耗的值用那个公式计算,现在让你求最小值 题解: 设dp[i]表示前i个字符需要消耗的 ...

  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

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

  5. [hdu3507 Print Article]斜率优化dp入门

    题意:需要打印n个正整数,1个数要么单独打印要么和前面一个数一起打印,1次打印1组数的代价为这组数的和的平方加上常数M.求最小代价. 思路:如果令dp[i]为打印前i个数的最小代价,那么有 dp[i] ...

  6. HDU3507 Print Article (斜率优化DP基础复习)

    pid=3507">传送门 大意:打印一篇文章,连续打印一堆字的花费是这一堆的和的平方加上一个常数M. 首先我们写出状态转移方程 :f[i]=f[j]+(sum[i]−sum[j])2 ...

  7. 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 ...

  8. hdu3507Print Article(斜率优化dp)

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

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

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

随机推荐

  1. HIVE的安装步骤及遇到的问题及解决方法

    一.root 用户 解压安装包 二 chown -R hadoop:hadoop apache-hive-1.2.2-bin/          chmod -R 755  apache-hive-1 ...

  2. Delphi 取整函数round、trunc、ceil和floor

    Delphi 取整函数round.trunc.ceil和floor 1.Round(四舍六入五留双)功能说明:对一个实数进行四舍五入.(按照银行家算法)例:var i, j: Integer;begi ...

  3. [NOI.AC] count

    思路: 考虑组合数学. 当所求中没有重复的时候,方案数就是\(C_{n + 1}^{k}\) 当有重复的时候... 设相等的数字之间的距离为\(len\) 当取0个数时,方案数就是\(C_{n - 1 ...

  4. solr 查询同一个core 的关联字段

    实现一个core里面多个字段的关联查询: 应用场景是: 词, 句子,文章 希望通过查询实现词,句子,文章里面共同有的关键字 private static CloudSolrServer cloudSo ...

  5. jq选项卡切换功能

    效果图: <!DOCTYPE html> <html lang="en"> <head> <style> *{margin:0;pa ...

  6. 17-MySQL-Ubuntu-数据表的查询-分页(六)

    分页(limit) 注: (1)limit位于SQL语句的最后面; (2)limit 2; 2表示查询前两条数据; (3)limit 0,2;  0表示查询第1页的起始数据的下标,2表示每页有两条数据 ...

  7. 原来腾迅的QQ号竟然是个int变量

    今天有个人加我好友,我一点开申请界面 我惊异了.... 我擦,号码竟然是个负数,但是人物资料里面却是个正数 有编程经验的人,一眼就看得出来原因.而且一眼就看得出来,它们是什么 1857918296 + ...

  8. ExecutorService线程池submit的使用

    有关线程池ExecutorService,只谈submit的使用 可创建的类型如下: private static ExecutorService pool = Executors.newFixedT ...

  9. linq语句,常用的查询,模糊查询,实体查询

    查询: //List是要查询的实体列表的集合 List.FindAll(n => n.NAME == NAME),    //NAME变量是要查询的条件 模糊查询 List.FindAll(s ...

  10. MySQL数据库的基本语法

    1.MySQL数据类型数值以及浮点型介绍 2.MySQL数据类型之字符串介绍 常用的有:char.varchar.text. 3.MySQL数据类型之时间类型介绍 常用的是:timestampt,将时 ...