BZOJ1563: [NOI2009]诗人小G(决策单调性 前缀和 dp)
题意
Sol
很显然的一个dp方程
\(f_i = min(f_j + (sum_i - sum_j - 1 - L)^P)\)
其中\(sum_i = \sum_{j = 1}^i len_j + 1\)
这个东西显然是有决策单调性的。
单调队列优化一下
我好像已经做过三个这种类型的题了,而且转移的时候\(w\)中总是带个幂函数。。interesting
#include<bits/stdc++.h>
#define chmax(a, b) (a = (a > b ? a : b))
#define chmin(a, b) (a = (a < b ? a : b))
#define LL long long
#define LDB long double
//#define int long long
using namespace std;
const int MAXN = 1e5 + 10;
inline int read() {
int x = 0, f = 1; char c = getchar();
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int T, N, L, P, sum[MAXN], q[MAXN], c[MAXN], pre[MAXN];//c???ߵ?λ?
char str[MAXN][35];
LDB f[MAXN];
LDB fastpow(LDB a, int p) {
LDB base = 1;
while(p) {
if(p & 1) base = base * a;
a = a * a; p >>= 1;
}
return base;
}
LDB calc(int j, int i) {
return f[j] + fastpow(abs(sum[i] - sum[j] - L), P);
}
int lower(int x, int y) {//???x????????
int l = x, r = N + 1, ans = 0;
while(l <= r) {
int mid = l + r >> 1;
if(calc(x, mid) >= calc(y, mid)) r = mid - 1;
else l = mid + 1;
}
return l;
}
void solve() {
N = read(); L = read() + 1; P = read();
for(int i = 1; i <= N; i++) {
scanf("%s", str[i] + 1);
sum[i] = sum[i - 1] + strlen(str[i] + 1) + 1;
}
memset(q, 0, sizeof(q));
for(int i = 1, h = 2, t = 2; i <= N; i++) {
while(h < t && c[h] <= i) h++;
f[i] = calc(q[h], i); pre[i] = q[h];
while(h < t && c[t - 1] >= lower(q[t], i)) t--;
c[t] = lower(q[t], i); q[++t] = i;
}
if(f[N] > 1e18) {puts("Too hard to arrange\n--------------------"); return;}
printf("%.0Lf\n", f[N]);
puts("--------------------");
}
main() {
for(T = read(); T; T--) solve();
}
BZOJ1563: [NOI2009]诗人小G(决策单调性 前缀和 dp)的更多相关文章
- bzoj1563: [NOI2009]诗人小G 决策单调性(1D1D)
目录 题目链接 题解 代码 题目链接 bzoj1563: [NOI2009]诗人小G 题解 \(n^2\) 的dp长这样 \(f_i = min(f_j + (sum_i - sum_j - 1 - ...
- [BZOJ1563][NOI2009]诗人小G(决策单调性优化DP)
模板题. 每个决策点都有一个作用区间,后来的决策点可能会比先前的优.于是对于每个决策点二分到它会比谁在什么时候更优,得到新的决策点集合与区间. #include<cstdio> #incl ...
- BZOJ1563:[NOI2009]诗人小G(决策单调性DP)
Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超过1018,则输出"Too hard to arr ...
- [NOI2009]诗人小G 决策单调性优化DP
第一次写这种二分来优化决策单调性的问题.... 调了好久,,,各种细节问题 显然有DP方程: $f[i]=min(f[j] + qpow(abs(sum[i] - sum[j] - L - 1))); ...
- P1912 [NOI2009]诗人小G[决策单调性优化]
地址 n个数划分若干段,给定$L$,$p$,每段代价为$|sum_i-sum_j-1-L|^p$,求总代价最小. 正常的dp决策单调性优化题目.不知道为什么luogu给了个黑题难度.$f[i]$表示最 ...
- BZOJ_1563_[NOI2009]诗人小G_决策单调性
BZOJ_1563_[NOI2009]诗人小G_决策单调性 Description Input Output 对于每组数据,若最小的不协调度不超过1018,则第一行一个数表示不协调度若最小的不协调度超 ...
- [BZOJ 1563] [NOI 2009] 诗人小G(决策单调性)
[BZOJ 1563] [NOI 2009] 诗人小G(决策单调性) 题面 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的.小 G ...
- BZOJ1563 NOI2009诗人小G(动态规划+决策单调性)
设f[i]为前i行的最小不协调度,转移枚举这一行从哪开始,显然有f[i]=min{f[j]+abs(s[i]-s[j]+i-j-1-m)p}.大胆猜想有决策单调性就好了.证明看起来很麻烦,从略.注意需 ...
- 2018.09.28 bzoj1563: [NOI2009]诗人小G(决策单调性优化dp)
传送门 决策单调性优化dp板子题. 感觉队列的写法比栈好写. 所谓决策单调性优化就是每次状态转移的决策都是在向前单调递增的. 所以我们用一个记录三元组(l,r,id)(l,r,id)(l,r,id)的 ...
随机推荐
- Windows Server 2016 IIS10安装URLRewrite 2.0组件方法
1,打开Regedit> HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ InetStp2,编辑“MajorVersion”并以十进制设置数值数据值为93 ...
- jdbcType DATE和TIMESTAMP区别
当传入null值时,jdbcType 会防止null空指针异常报错 Mybatis 中 jdbcType =DATE,日期精确到年月日 剩余分秒 填0补齐 jdbcType= TIMESTAMP,日期 ...
- P3348 [ZJOI2016]大森林
\(\color{#0066ff}{ 题目描述 }\) 小Y家里有一个大森林,里面有n棵树,编号从1到n.一开始这些树都只是树苗,只有一个节点,标号为1.这些树都有一个特殊的节点,我们称之为生长节点, ...
- vue.js使用elemnetUi
安装: npm 安装 推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用. npm i element-ui -S 引入 Element 你可以引入整个 Element,或是 ...
- 项目笔记《DeepLung:Deep 3D Dual Path Nets for Automated Pulmonary Nodule Detection and Classification》(一)预处理
最近一个月都在做肺结节的检测,学到了不少东西,运行的项目主要是基于这篇论文,在github上可以查到项目代码. 我个人总结的肺结节检测可以分为三个阶段,数据预处理,网络搭建及训练,结果评估. 这篇博客 ...
- 【Leetcode】Remove Duplicates from Sorted List II
Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...
- POJ1060 Modular multiplication of polynomials
题目来源:http://poj.org/problem?id=1060 题目大意: 考虑系数为0和1的多项式.两个多项式的加法可以通过把相应次数项的系数相加而实现.但此处我们用模2加法来计算系数之和. ...
- C++_派生类的构造函数及派生类和基类之间的特殊关系
派生类和基类的概念及派生类构造函数的原理: 创建一个叫做TableTennisPlayer的基类,记录会员的名字和是否有球桌. //声明一个基类 class TableTennisPlayer { p ...
- Github如何快速添加add文件到暂存区之git add
git add作用是将代码从工作区提交到暂存区 通常会想到:git add [file1] [file2] : 这个方法添加文件比较慢,如果文件比较多怎么办? git add *.扩展名 这条命令 ...
- window.open 设置高和宽无效
当设置_self属性时,再设置宽和高就不管用,这个宽高会继承父窗口的宽高! window.open("url","_self","width=100, ...