随笔分类 - DP
摘要:最小值就一个点全部是出边,相邻的点都是入边,这么一直排下去,答案就是 $n 1$ 最大值就选重心,每个子树要么全是出边要么全是入边 每个子树里的答案已经确定了,子树之间若有 $x$ 个是出边,就有 $n x 1$ 个是入边 经过重心的答案就是 $x(n x 1)$ 相当于有子树个物品,每个物品的大小
阅读全文
摘要:预处理一下前缀后缀最大值 每次用set贪心取一个合适的数 然后枚举分割点 有可能两次都取了同一个数 $x$,而 $y$ 没被取到 若 $x y$,那么就可以在点数小的那一轮拿 $y$ 替换 $x$ 若 $x inline int _i() { int x = 0, f = 1; char ch =
阅读全文
摘要:$dp[i][j]$ 表示走到 $(i,j)$ 的方案数 $dp[i][j] = \sum\limits_{x define mid ((l + r) 1) define lp tree[p].l define rp tree[p].r const int MOD = 1000000007; con
阅读全文
摘要:$dp[i][0/1]$ 表示考虑前 $i$ 个元素,以 $i$ 结尾的最大子段和,$0$ 表示还未交换过,$1$ 表示已经交换过 $dp[i][0] = a[i] + \max\{dp[i 1][0],0\}$ $dp[i][1] = \max\{dp[i][0],dp[i 1][1]+a[i],
阅读全文
摘要:$dp[p][u][s_0][tol]$ 表示警察从 $p$ 走到 $u$,$u$ 相对于 $p$ 的子树内有 $s_0$ 个犯人,全局总共有 $tol$ 个犯人的最小花费时间。 当 $tol = 0$ 时,花费为 $0$。 当 $s_0=0$ 时,花费为 $\text{INF}$,因为这一步是没有
阅读全文
摘要:$f[i][k]$ 表示前 $i$ 个分成 $k$ 段,且最后一段以 $i$ 结尾的最小值 容易写出转移方程 $f[i][k] = \min \{f[j][k - 1] + calc(j+1,i)\}$ 因为具有决策单调性(打表 or 证明(不会)),就可以一种分治算法来优化 具体实现就是 $sol
阅读全文
摘要:$f[i][k]$ 表示前 $i$ 个分成 $k$ 段,且最后一段以 $i$ 结尾的最小值 容易写出转移方程 $f[i][k] = \min \{f[j][k - 1] + calc(j+1,i)\}$ 因为具有决策单调性(打表 or 证明(不会)),就可以一种分治算法来优化 具体实现就是 $sol
阅读全文
摘要:1052 dp即可$dp[i][j]$ 表示前 $i$ 个数分成 $j$ 段。$dp[i][j]=a[i]+\max\{dp[i-1][j], \max\{dp[k][j-1]\}\}$前缀max优化一下即可 #include <bits/stdc++.h> #define ll long long
阅读全文
摘要:一个 $(l,r)$ 有两个后继,所以 sg 值最大只有 2,$r-l+1$ 相等的 pair 的 sg 值相同,那么就枚举 $d=r -l+1$,对于一个 $d$ 很容易求有多少对 $(l,r)$ 满足 $r-l+1=d$ 打表发现 $d$ 的 sg 值最多只有 100 段。 设 $g_i$ 表示
阅读全文
摘要:把 'O' 看成 'X',然后枚举它的四个方向看看是否能放,然后枚举 $2^4$ 种可能表示每种方向是否放了,放了的话就标成 'X',就相当于容斥,对于新的图去dp。 dp就是铺地砖,行用二进制来表示是否放了砖块。 #include <bits/stdc++.h> const int MOD = 1
阅读全文
摘要:由期望的线性性,$E(\sum \limits_{i=1}^{k} X_i) = \sum \limits_{i=1}^k E(X_i)=kE(X_1)$,只需要求出打完 $n$ 个怪后一件武器的期望值。 $dp[i][j]$ 表示打完 $i$ 个怪后,初始 level 为 $j$ 的武器能赚的钱,
阅读全文
摘要:用dp来解决博弈问题这是第一次做,之前遇到一个博弈dp的题还没补。。设 $L_{i,j},R_{i,j}$ 分别表示在区间 $[i,j]$ 左右放上多少石子能让先手必败。首先这个 $L,R$ 肯定是唯一的,假设不唯一,即存在 $L_1,L_2$ 加在当前区间左端能使先手必败,设 $L_1>L_2$,
阅读全文
摘要:$dp_i$ 表示在 $i$ 处建一个仓库之后的最小花费。转移方程为 $dp_i = \min \{dp_j + \sum \limits_{k=j+1}^{i-1}p_k\times(x_i-x_k)+c_i\}=\min \{dp_j + x_i\sum \limits_{k=j+1}^{i-1
阅读全文
摘要:如果这张图是个DAG,那么最长链就是第一个答案,所以就先tarjan缩点。 第二部分拓扑排序解决,注意重边会影响答案,所以不要重复转移。 #include <bits/stdc++.h> namespace IO { char buf[1 << 21], *p1 = buf, *p2 = buf;
阅读全文
摘要:根据奇偶性,把x,y坐标加起来是奇数的位置翻转一下,就变成求最大01子矩阵了。 然后预处理出每个位置往上最长的01路径,每行用一个单调栈解决。 单调栈从栈底到栈顶维护每一个矩阵的高度和宽度,按高度递增维护。 当前高度如果小于栈顶的高度,那就将栈顶的矩阵更新答案,并且出栈,但是它的宽度是可以为当前高度
阅读全文
摘要:基环森林上DP。 我刚开始想的就是找到环,然后把环上每个点及它的子树缩成一个点,就变成一个环上的DP了。然后就是强制第一个不取和强制最后一个不取。 看了别人的题解发现可以不用那么麻烦,只要找到环上任意相邻的两点,强制把这条边断开,然后还是DP两次就行了。 DP方程就比较naive了。 #includ
阅读全文
摘要:$dp[i][j][k][l]$ 表示 $i$ 个男生,$j$ 个女生,结尾段男生最多比女生多 $k$ 个,女生最多比男生多 $l$ 个。 $dp[i + 1][j][k + 1][\max\{l - 1, 0\}]$ $+=$ $dp[i][j][k][l]$ $dp[i][j+1][\max\{
阅读全文
摘要:$dp[i]$ 表示以 $i$ 物品为结尾的最小费用 $dp[i] = min(dp[j] + (j - i + \sum c_k - l)^2)$ 斜率优化一下即可。 #include <bits/stdc++.h> #define ll long long using namespace std
阅读全文
摘要:显然有一个DP方程 $dp[i][j]$ 表示到第 $i$ 位已经末尾匹配了 $j$ 位的方案数。 暴力的话就枚举下一位放啥,看放完之后又匹配了多少。 这里可以引入一个 $f[i][j]$ 数组表示从不吉利数字当前匹配了 $i$ 位,加上一个字符能匹配 $j$ 位的方案数。 这一部分可以用kmp得到
阅读全文
摘要:$cost[i][j]$ 表示第 $i$ 天到第 $j$ 天都走同一条路线时每天的最小花费,即为 $1$ 到 $m$ 的最短路。dijkstra即可。然后 $dp[i]$ 表示到第 $i$ 天的最小花费$dp[i] = min(dp[j] + cost[j + 1][i] * (i - j) + k
阅读全文

浙公网安备 33010602011771号