传送门

设句子加上空格长度前缀和为sss

转移方程为

fi=min⁡1≤j<i{fj+∣si−sj−L−1∣P}f_i=\min_{1\leq j<i}\{f_j+|s_i-s_j-L-1|^P\}fi​=1≤j<imin​{fj​+∣si​−sj​−L−1∣P}

不难发(cai)现(chu)决策具有单调性

本文重点讲决策单调dp的实现

由于决策单调,所以每个决策有效的都是一个区间

用队列按顺序维护所有区间

开始时加入“决策000的生效区间为整个序列”

每到一个位置,弹出所有已经失效的区间,队头就是当前最优决策,算出答案

然后用当前位置更新队列

先将队尾无用的弹掉,因为单调,所以判断如果队尾决策对区间最左边没有当前位置作为决策优,弹队尾。

如果队列中仍有元素,二分出当前砍掉的位置。

最后把挖掉的部分都用当前位置填上。注意如果没挖直接忽略

本题中由于主要是大小比较,可以牺牲精度追求值域,用long double存

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <cmath>
#define MAXN 100005
using namespace std;
typedef long double ld;
struct key{int c,p;}q[MAXN];
int head,tail;
char str[MAXN][35];
int s[MAXN],n,l,p,ans[MAXN];
ld dp[MAXN];
inline ld abso(const ld& x){return x<0? -x:x;}
inline ld qpow(ld a,int p)
{ld ans=1;while (p){if (p&1) ans=ans*a;a=a*a;p>>=1;}return ans;
}
inline ld calc(int n,int i){return dp[i]+qpow(abso(s[n]-s[i]-l-1),p);}
void print(int n)
{if (!n) return;print(ans[n]);for (int i=ans[n]+1;i<=n;i++){printf("%s",str[i]);if (i<n) putchar(' ');}puts("");
}
int main()
{int T;scanf("%d",&T);while (T--){head=1,tail=0;scanf("%d%d%d",&n,&l,&p);for (int i=1;i<=n;i++) scanf("%s",str[i]),s[i]=s[i-1]+strlen(str[i])+1;q[++tail]=(key){0,n};for (int i=1;i<=n;i++){while (head<tail&&i>q[head].p) ++head;dp[i]=calc(i,ans[i]=q[head].c);while (head<=tail&&calc(q[tail-1].p+1,i)<calc(q[tail-1].p+1,q[tail].c)) --tail;if (head<=tail){int l=q[tail-1].p+1,r=q[tail].p,mid;while (l<r){mid=(l+r+1)>>1;if (calc(mid,q[tail].c)<calc(mid,i)) l=mid;else r=mid-1;}q[tail].p=l;}if (q[tail].p<n) q[++tail]=(key){i,n};}if (dp[n]>1e18) puts("Too hard to arrange");else{printf("%lld\n",(long long)dp[n]);print(n);}puts("--------------------");}return 0;
}

【NOI2009】诗人小G【决策单调性dp】相关推荐

  1. BZOJ1563:[NOI2009]诗人小G(决策单调性DP)

    Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arr ...

  2. [BZOJ1563][NOI2009]诗人小G[决策单调性优化]

    int T, n, m, l, p, pre[MAXN], q[MAXN], h, t, b[MAXN];//b[i]表示决策点是i的最后一个位置 llf dp[MAXN]; char s1[35]; ...

  3. 决策单调性Ⅰ:四边形不等式(bzoj 1563: [NOI2009]诗人小G)

    题目描述: 给出n个数字和常数L,你可以任意合并相邻的两个数字a[x]和a[x+1],并得出一个新的数a[x]+a[x+1]+1,一通合并后得到一个有若干个数的序列,这个序列的不协调值为∑|(a[i] ...

  4. P1912 [NOI2009]诗人小G

    P1912 [NOI2009]诗人小G 思路: 平行四边形不等式优化dp 因为f(j, i) = abs(sum[i]-sum[j]+i-j-1-l)^p 满足平行四边形不等式 j < i f( ...

  5. NOI2009 诗人小G

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

  6. 【NOI 2009】诗人小G

    [NOI 2009]诗人小G Problem Description 小 \(G\) 是一个出色的诗人,经常作诗自娱自乐.但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对 ...

  7. [关于决策单调性DP]

    [关于决策单调性DP] [~留个坑以后再填] 1.四边形不等式&凸完全单调性 2.决策单调性 不难发现,其实四边形不等式的充要条件就是w(x,i+1)-w(x,i)关于x单调不增. 然后处理的 ...

  8. 洛谷P1912:诗人小G(二分栈、决策单调性)

    二分栈,就是通过二分维护的栈 (逃) 解析 本题的决策单调性可以说是显然 但是本题是同维度(其实只有一维)自左向右转移,分治的写法是不能奏效的 所以我们使用决策点调性的另一种实现方法:二分栈 具体来说 ...

  9. 一个诗人的一生——诗人小G的人生

    看到群里有人说周末作文是以一个诗人的一生为题写作文-于是就突发脑洞写了这么个东西. 哇发出来好羞耻啊(x 诗与人生 某一天,在某一个地方,小G诞生了. 小G原本是有自己的名字的,但是在某一天之后,他就 ...

最新文章

  1. 计算机制造理论,计算制造
  2. 如何使用SAP APF里的过滤器
  3. 致我测试之路的“七年之痒”
  4. linux文件IO——文件IO介绍
  5. [转]simhash进行文本查重
  6. 每天Leetcode 刷题 初级算法篇-颠倒二进制位
  7. Maven 常用仓库网址
  8. 卖零食靠什么产品引流?零食店怎么做引流?
  9. 网络安全web渗透技术
  10. c语言 音符符号大全,音符符号大全
  11. 2022年NPS基准:NPS分数达到多少算好?
  12. dell emc isilon环境 Windows共享文件下生成.snapshot无法删除
  13. 琵琶行·并序--白居易
  14. mc服务器fabric安装位置,也许这是史上最详细的Fabric安装教程,助你在1.14/1.15安装mod...
  15. macOS:半分钟获取FileVault 2的密码 - PCILeech
  16. 识别各种安全设备及当今体现形态-区别UTM与NGFW
  17. 王祥林 计算机专业英语答案,计算机专业英语 第3版 配套习题 作者 王祥林 陈静姣 模拟试题1.doc...
  18. 代码审计[java安全编程]
  19. 1111111111111111111111111111
  20. 神经网络种类及应用领域,常用的神经网络有哪些

热门文章

  1. python 文件写入多个参数_pandas 把数据写入txt文件每行固定写入一定数量的值方法...
  2. 清北学霸的书单居然那么有讲究?看看你比学霸少看了哪些书......
  3. Python 写各大聊天系统的屏蔽脏话功能原理
  4. SparkSQL DataFrame进阶篇
  5. php prettyprinter,gdb运行时错误:prettyprinter已注册:libstdc++v6
  6. 数字转字符函数_Excel之文本函数CONCATENATE/TEXT/LEFT/MID/RIGHT/FIND/LEN
  7. java awt区域_java的awt包中有没有表示区域的类或者方法,可以传递一个Rectangle
  8. php 初始二维数组长度,php二维数组排序与默认自然排序的方法介绍
  9. Java图形 图像与多媒体基础,十一. 图形、图像与多媒体1.绘图基础
  10. yolo算法的优缺点分析_yolo算法介绍