摘要:"原题链接" 普通的$DP$题,~然而我又做了好久,太菜了~。 很容易发现直接描述“交换”这一操作比较困难,于是我们可以考虑将这一操作转换一下:交换一个 和`z z`变为 ,一个 变为 。 那么我们可以求出当$j$个 变为 ,$k$个 变为 时最多能出现的 个数。而“交换”这一操作就是当$j=k$的
阅读全文
摘要:"原题链接" 乍看完全没啥想法,实际上很简单。 首先预备知识: "最大子段和" 的做法。 对于环状最大两段子段和,实际上只有两种情况(设$0$表示不取,$\_$表示取): 1. $0000\_\_\_\_0000\_\_\_\_0000$,即没有利用环状这个条件,直接在原序列里取。 2. $\_\_
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" $DP$水题。 定义$f[i][j]$表示小猫在高度$i$,位于第$j$棵树时最多能吃到的柿子的数量。分为直接往下跳和跳到另一棵树两个决策。 那么很容易写出状态转移方程: $$f[i][j] = \max \{ f[i + 1][j], f[i + Delta
阅读全文
摘要:"原题链接" $DP$水题,但我用了个三维数组。。在某谷看到的题解全是二维的。。不过反正能$A$,管它呢。 定义$f[i][j][k]$表示前$i$本书中不选$j$本,且最后一本选的书的下标为$k$。设$a[i]$表示第$i$本书的宽度,$m$表示最多能不选几本,$abs()$为绝对值。 于是有状态
阅读全文
摘要:"原题链接" 又是一道挺水的类区间$DP$。 因为题目给定的是一个环,所以先断环成链再$DP$即可。 设$f[i][j][l]$表示$i \sim j$之间的数分成$l$段的最大值,$g[i][j][l]$为最小值,$mod(x)$为$(x \mod 10 + 10) \mod 10$,$s[]$为
阅读全文
摘要:"原题链接" 挺水的一道区间$DP$。 设$f[i][j]$表示在中序遍历下编号$i \sim j$的点所构成的子树的最高加分,枚举$k$为子树的根,则有状态转移方程: $$f[i][j] = \max \limits _{k = i + 1} ^ {j 1} \{ f[i][k 1] \times
阅读全文
摘要:"原题链接" 爆搜面值,$DP$判断就好。 一开始打了记搜,结果连$5\ 5$的数据都过不去。。最后还是老老实实写了$DP$,不过还是跑不过$7\ 5$的数据,但因为这题数据极水,所以轻松过了。 我也去网上翻了翻,目前没有发现哪份代码能真正过满数据,所以就懒得改了。~~反正能$A$~~ cpp in
阅读全文
摘要:"原题链接" 设$f[i][j]$表示在$[1, i]$中放置$j$个乘号,且第$i$个数字后面放第$j$个乘号时所获得的最大乘积。$ace(1, i)表示将$1 \sim i$的数字变为一个数。 有状态转移方程: $$f[i][j] = \max \{ f[i][j], \max \limits
阅读全文
摘要:"原题链接" ~~继续写水题中~~ $DP$水题。 不过费用流解更灵活,可以解决$k$条路。 所以就写了个费用流。 cpp include include using namespace std; const int N = 1e4 + 10; int fi[N], ne[N], da[N], di
阅读全文
摘要:"原题链接" $DP$水题。 ~~还有哪个zz打上去的高精标签,害我还敲了一波高精。。~~ cpp include include using namespace std; typedef long long ll; const int N = 23; bool v[N][N]; int mo_x[
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 简单的数位$DP$,套模板就好。
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 我们可以倒着来$DP$。 设$f[i][j]$表示剩余$i$个人,从庄家数起第$j$个人的胜率,设当前枚举到第$k$张牌,该情况下这一轮淘汰的位置为$x$,则有状态转移方程: $\qquad\qquad f[i][j] = f[i][j] + \dfrac{f
阅读全文
摘要:"原题链接" 可以使用二进制来表示后$m$个花圃的状态。 设$f[i][k]$表示前$i$个花圃,后$m$个状态为$k$,设$k$可由$k ^ \prime$转移来,则有状态转移方程: $\qquad\qquad f[i][k] = \sum f[i][k ^ \prime]$ 发现这个转移方程可以
阅读全文
摘要:"原题链接" 神仙$DP$啊。。。 题解请移步隔壁 "大佬的博客" $QAQ$
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 先讲下关于波动数列的$3$个性质。 性质$1$:对于数列中的每一对$i$和$i + 1$,若它们不相邻,那么交换这两个数形成的依旧是一个波动数列。 性质$2$:对于任何一个由$1\sim n$组成的波动数列,将每个数$a_i$变为$n + 1 a_i$,形成的
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 注意该题的子矩阵可以是空矩阵 ,即可以不选,答案的下界为$0$。 设$f[i][j][k]$表示前$i$行选择了$j$个子矩阵,选择的方式为$k$时的最大分值之和。 1. $k = 0$表示该行不选数。 2. $k = 1$表示该行只选左边的数。 3. $k
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 显然可以用数据结构或$ST$表或单调队列来维护最值。 这里采用单调队列来维护。 先用单调队列维护每一行的最大值和最小值,区间长为正方形长度。 再用单调队列维护 之前维护出的每行最值数组 的每一列的最大值和最小值,区间同上。 最后维护出的数组其实就是以每个点为左
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 注意到$B[i]$很小,考虑状压$DP$。 设$f[i][j][k]$表示前$i 1$个人已经拿到菜,第$i$个人及其后面$7$个人是否拿到菜的状态为$j$,上一个拿到菜的人的编号为$i + k, 8\leqslant k \leqslant 7$时所用的最短
阅读全文
摘要:"原题链接" 太菜了,又去看了题解($DP$写一道看一道$QAQ$ "题解" cpp include using namespace std; const int N = 510; int a[N], f[N], g[N], l; inline void re_l() { char c = getc
阅读全文
摘要:"BZOJ原题链接" "洛谷原题链接" 这题挺难想状态的,刚看题感觉是状压,但数据$100$显然不可能。 注意到每行每列只能放$0\sim 2$个棋子,所以我们可以将这个写入状态。 设$f[i][j][k]$表示放了前$i$行,共有$j$列只放了一个棋子,共有$k$列放了两个棋子,而没有放棋子的列数
阅读全文