传送门 题解 决策单调性是个啥……导函数是个啥……这题解讲的是啥……我是个啥…… //minamoto #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #define LD long double #define calc(i,j) f[j]+qpow(abs(s[i]-s[j]-L)) using namespace std; inline int read(){…
洛谷题目传送门 闲话 看完洛谷larryzhong巨佬的题解,蒟蒻一脸懵逼 如果哪年NOI(放心我这样的蒟蒻是去不了的)又来个决策单调性优化DP,那蒟蒻是不是会看都看不出来直接爆\(0\)?! 还是要想点办法,不失一般性也能快捷地判定决策单调. 对于判定决策单调的分析 再补一句决策单调性的概念:状态转移方程形如\(f_i=\min/\max_{j=1}^{i-1} g_j+w_{i,j}\),且记\(f_i\)的最优决策点为\(p_i\)(也就是\(f_i\)从\(g_{p_i}+w_{i,p_…
[NOI2009]诗人小G 题目描述: 小G是一个出色的诗人,经常作诗自娱自乐. 但是,他一直被一件事情所困扰,那就是诗的排版问题. 一首诗包含了若干个句子,对于一些连续的短句,可以将它们用空格隔开并放在一行中,注意一行中可以放的句子数目是没有限制的. 小G给每首诗定义了一个行标准长度(行的长度为一行中符号的总个数),他希望排版后每行的长度都和行标准长度相差不远. 显然排版时,不应改变原有的句子顺序,并且小G不允许把一个句子分在两行或者更多的行内. 在满足上面两个条件的情况下,小G对于排版中的每…
传送门 决策单调性优化dp板子题. 感觉队列的写法比栈好写. 所谓决策单调性优化就是每次状态转移的决策都是在向前单调递增的. 所以我们用一个记录三元组(l,r,id)(l,r,id)(l,r,id)的队列来维护,表示在(l,r)(l,r)(l,r)这个区间当前的决策都是ididid,然后在每次求决策点的时候弹一下队头,求出当前解之后我们更新一下队尾就行了. 代码: #include<bits/stdc++.h> #define N 100005 #define ld long double u…
LINK 因为是图片题就懒得挂了 简要题意:有n个串,拼接两个串需要加一个空格,给你l和p,问你拼接后每个串的总长减l的绝对值的p次方的最小值 首先打表发现一下这题是决策单调的对于所有数据都成立就当他一定成立了 然后网上有神仙用四边形不等式证明了这个东西LINK 我就懒得不会证明了 然后考虑用一个双向的队列维护出每个决策点对应的单调区间 然后保证所有区间一定是连续的 就构成了所有dp的转移区间 其实和bzoj2216非常像 代码都差不多,直接维护就可以了 最后上DP式子: dp[i] = dp[…
地址 n个数划分若干段,给定$L$,$p$,每段代价为$|sum_i-sum_j-1-L|^p$,求总代价最小. 正常的dp决策单调性优化题目.不知道为什么luogu给了个黑题难度.$f[i]$表示最小代价.然后有个正常的dp方程. $f[i]=min \{ f[j]+|sum_i-sum_j-1-L|^p \} $ 然后观察发现带高次项,不好斜率优化或单调队列,考虑有没有决策单调性.本来是可以打表证明的,然后拍一下.然而我杠一波瞎证了一下单调性. $证明:$ $已知f[j]+|sum_i-su…
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1563 分析: 首先可得朴素的方程:f[i]=min{f[j]+|s[j]-j-s[i]-i-L+1|^P} j=0..i-1 这种1D/1D的动态规划要优化肯定只有决策单调性优化,打个表发现的确如此,然后就愉快的O(nlogn)了…
模板题. 每个决策点都有一个作用区间,后来的决策点可能会比先前的优.于是对于每个决策点二分到它会比谁在什么时候更优,得到新的决策点集合与区间. #include<cstdio> #include<algorithm> #include<cstring> #define rep(i,l,r) for (int i=(l); i<=(r); i++) typedef long double ll; using namespace std; ; const ll MAX…
题意 题目链接 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 :…
正题 题目链接:https://www.luogu.com.cn/problem/P1912 题目大意 给出\(n\)个字符串,把这些字符串依次用空格(算一个长度)连接分成若干段,若一段长度为\(x\),那么代价是\(|x-L|^P\) 求代价和最小的方案,如果代价大于\(1e18\)则输出其他东西 \(1\leq n\leq 10^5,1\leq L\leq 3\times 10^6,1\leq P\leq 10\) 解题思路 \(s_i\)表示前\(i\)个字符串的长度和加\(i\),那么有…