题面

今天考试考了,于是开始糊学决策单调性DP

这是一个完全不会优化DP的人

决策单调性DP的一种优化方法是用单调队列优化

存下{左端点l,右端点r,最优决策点p}的三元组,按照单调队列的通常操作来说:

(0.初始化,将整个序列丢进去)

1.弹队头:弹掉所有不合法的三元组(r<i的)

2.求答案,同时更新队头的左端点

3.弹队尾:

①如果队尾的决策点不如i优,说明队尾这整个三元组当前的决策点太靠前了,直接弹掉

②当弹不掉时,根据决策单调性,队尾这个三元组后面的一部分决策点是i,前面的不是,二分出这个位置来修改。当然如果你发现事实上决策点在l就可以直接把整个都弹了=。=

4.入队(没啥可说的)

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define lli long long
  6. #define double long double
  7. using namespace std;
  8. const int N=;
  9. const lli inf=1e18;
  10. struct a
  11. {
  12. int l,r,p;
  13. }que[N];
  14. int T,n,m,k,f,b,top,pre[N],stk[N];
  15. lli len[N]; double dp[N]; char str[N][];
  16. double Qpow(double x,int k)
  17. {
  18. if(k==) return x;
  19. double tmp=Qpow(x,k/);
  20. return k%?tmp*tmp*x:tmp*tmp;
  21. }
  22. double Calc(int a,int b)
  23. {
  24. return dp[b]+Qpow(fabs(len[a]-len[b]-m-),k);
  25. }
  26. int main()
  27. {
  28. scanf("%d",&T);
  29. while(T--)
  30. {
  31. scanf("%d%d%d",&n,&m,&k);
  32. for(int i=;i<=n;i++)
  33. {
  34. scanf("%s",str[i]+);
  35. len[i]=len[i-]+strlen(str[i]+)+;
  36. }
  37. que[f=b=]=(a){,n,};
  38. for(int i=;i<=n;i++)
  39. {
  40. while(f<b&&que[f].r<i) f++;
  41. int pt=que[f].p; que[f].l++;
  42. dp[i]=Calc(i,pt),pre[i]=pt;
  43. while(f<b&&Calc(que[b].l,que[b].p)>=Calc(que[b].l,i)) b--;
  44. int lp=que[b].l,rp=que[b].r,ps=rp+;
  45. while(lp<=rp)
  46. {
  47. int mid=(lp+rp)/;
  48. if(Calc(mid,i)<=Calc(mid,que[b].p)) rp=mid-,ps=mid;
  49. else lp=mid+;
  50. }
  51. (ps==que[b].l)?b--:que[b].r=ps-;
  52. if(ps<=n) que[++b]=(a){ps,n,i};
  53. }
  54. if(dp[n]>inf) puts("Too hard to arrange");
  55. else
  56. {
  57. printf("%lld\n",(lli)dp[n]),top=;
  58. for(int i=n;i;i=pre[i]) stk[++top]=i; stk[++top]=;
  59. for(int i=top;i;i--)
  60. for(int j=stk[i+]+;j<=stk[i];j++)
  61. {
  62. printf("%s",str[j]+);
  63. j==stk[i]?puts(""):putchar(' ');
  64. }
  65. }
  66. puts("--------------------");
  67. }
  68. return ;
  69. }

解题:NOI 2009 诗人小G的更多相关文章

  1. [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)

    [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...

  2. NOI 2009 诗人小G

    题目描述 Description 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行 ...

  3. NOI 2009A 诗人小G

    NOI 2009A 诗人小G 诗人小G [问题描述] 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们 ...

  4. C++之路进阶——codevs2933(诗人小G)

    2933 诗人小G 2009年NOI全国竞赛  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 小G是一个出色的诗人 ...

  5. 【Luogu1912】【NOI2009】诗人小G(动态规划)

    [Luogu1912][NOI2009]诗人小G(动态规划) 题面 洛谷 题解 原来\(NOI\)这么多神仙题... 考虑一个极其明显的\(dp\) 设\(f[i]\)表示前\(i\)个句子产生的最小 ...

  6. LG1912 [NOI2009]诗人小G

    题意 题目描述 小G是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以 ...

  7. bzoj1563: [NOI2009]诗人小G 决策单调性(1D1D)

    目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - ...

  8. 1563: [NOI2009]诗人小G

    1563: [NOI2009]诗人小G https://lydsy.com/JudgeOnline/problem.php?id=1563 分析: 直接转移f[i]=f[j]+cost(i,j),co ...

  9. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

随机推荐

  1. C# read write ini file

    [DllImport("kernel32")] private static extern long WritePrivateProfileString(string sectio ...

  2. tf tensor 输出

    在学习TensorFlow的过程中,我们需要知道某个tensor的值是什么,这个很重要,尤其是在debug的时候.也许你会说,这个很容易啊,直接print就可以了.其实不然,print只能打印输出sh ...

  3. 设计模式 笔记 享元模式 Flyweight

    //---------------------------15/04/20---------------------------- //Flyweight 享元模式------对象结构型模式 /* 1 ...

  4. lambda表达式,map函数

    lambda只是一个表达式,不需要定义函数,故也是匿名函数,用法为:lambda 参数:表达式. x=5 list1=[2,3,4] list2=[10,20,30] s=lambda x:x**3 ...

  5. PAT甲题题解-1088. Rational Arithmetic (20)-模拟分数计算

    输入为两个分数,让你计算+,-,*,\四种结果,并且输出对应的式子,分数要按带分数的格式k a/b输出如果为负数,则带分数两边要有括号如果除数为0,则式子中的结果输出Inf模拟题最好自己动手实现,考验 ...

  6. LeetCode 141. Linked List Cycle环形链表 (C++)

    题目: Given a linked list, determine if it has a cycle in it. To represent a cycle in the given linked ...

  7. LeetCode 637. Average of Levels in Binary Tree二叉树的层平均值 (C++)

    题目: Given a non-empty binary tree, return the average value of the nodes on each level in the form o ...

  8. Notes of Daily Scrum Meeting(12.21)

    今天的燃尽图把周六的进度加了进来,由于我的失误没有及时更新TFS,所以出现了一些错误,向大家道歉. 下面是今天的任务总结: 团队成员 今日团队工作 陈少杰 继续进行网络连接的调试 王迪 测试搜索的功能 ...

  9. ios UnitTest 学习笔记

    一.运行第一个单元测试: 1.在Xcode 5中新建一个工程默认自带一个单元测试的文件夹,IDE自动生成了一个实现XCTestCase的.m文件,里面有一个失败测试(早期版本中实现的是SenTestC ...

  10. 第二个Sprint冲刺总结

    第二个Sprint冲刺总结 ( 1)团队Github: https://github.com/ouqifeng/EasyGoOperation.git ( 2 ) 团队贡献分: 廖焯燊:22 何武鹏: ...