
dp
文章平均质量分 87
IDSY QAQ
日常三问:我被机残了吗?我密码被盗了吗?我的号还在吗?
展开
-
治疗计划题解
dj nb原创 2022-06-30 19:01:45 · 139 阅读 · 0 评论 -
K-Inversion Permutations 题解
把原序列 aaa 转换成逆序对序列 ddd,did_idi 表示 aia_iai 前有多少个数大于它。容易知道,每个不同的 ddd 序列有且仅有一个对应的 aaa 序列。所以我们只需要统计 ddd 序列的个数了。ddd 序列需要满足的条件是:∀di≤i,∑i=1ndi=k\forall d_i \leq i, \sum_{i = 1}^{n} d_i = k∀di≤i,∑i=1ndi=k容斥,枚举 ddd 的某些位置一定超过了他的下标。则 ans=Fnk−∑i=1nFnk−i+∑i=1n原创 2021-11-23 16:56:09 · 443 阅读 · 1 评论 -
[HDU-6314]Matrix题解
难点:构造容斥系数。f[i][j]表示恰好有i行j列为黑色,g[i][j]表示一个i行j列的矩阵染色满足每一行每一列至少有一个白色格子的方案数f[i][j] 表示恰好有 i 行 j 列为黑色,g[i][j] 表示一个 i 行 j 列的矩阵染色满足每一行每一列至少有一个白色格子的方案数f[i][j]表示恰好有i行j列为黑色,g[i][j]表示一个i行j列的矩阵染色满足每一行每一列至少有一个白色格子的方案数转移:f[i][j]=(ni)(mj)×g[n−i][m−j]f[i][j] = \binom{原创 2021-11-17 16:57:55 · 637 阅读 · 0 评论 -
[AGC026D]Histogram Coloring
计算一个区间 [l,r][l, r][l,r] 的贡献,方法就是找到这个区间内 hhh 最小的几个点,然后从这几个点裂开计算贡献。例如上图,我们就把整个问题的求解拆分成只考虑绿色部分的求解再利用几个绿色部分的信息整合到整体的信息。状态:f(p,0)f (p, 0)f(p,0) 表示只考虑区间 ppp,且 ppp 最后一行为红蓝交错的满足要求的方案数f(p,1)f (p, 1)f(p,1) 表示只考虑区间 ppp 的满足要求的方案数g(p)g (p)g(p) 表示只考虑区间 ppp,且 ppp原创 2021-10-29 22:25:54 · 261 阅读 · 0 评论 -
「CSP-S 2021 括号序列」题解
考场挂分器,送分题变成送命题。一、状态:令 dp[i][j]dp[i][j]dp[i][j] 表示 [i,j][i, j][i,j] 这个区间内组成超级括号序列的方案数令 f[i][j]f[i][j]f[i][j] 表示在 dp[i][j]dp[i][j]dp[i][j] 的要求上,添加限制:方案中,括号 iii, jjj 匹配。令 ans[i][j]ans[i][j]ans[i][j] 表示 [i,j][i, j][i,j] 这个区间能不能做到 [l,r][l, r][l,r] 全为 “*”。原创 2021-10-27 13:29:04 · 1074 阅读 · 0 评论 -
[多校联考] S
1. 前言和刚学的 I Love Random 一个道理,所以为了巩固赶紧又来写一篇。2.题解这道题和 I Love Random 一个道理,考虑构造答案序列,但是这道题和 I Love Random 有一个不一样的 Hint,就是一个非常小的贪心:假设我们现在构造了一个答案序列 p, 则 p 中同类元素的相对位置和 a 中同类元素的相对位置是不变的。所以我们只关注在答案序列的前 iii 个中有几个 RRR, GGG, YYY 就行了。我们定义数组 dp[i][j][k][z][ch]dp[i][原创 2021-10-22 20:23:49 · 159 阅读 · 0 评论 -
I Love Random
原序列为 aaa,答案序列为 ppp。令 f[i][j]f[i][j]f[i][j] 表示构造了结果序列的前 iii 位,p[i]=a[j]p[i] = a[j]p[i]=a[j] ,且 a[j]a[j]a[j] 修改 p[i]p[i]p[i] 是操作最后一步 (没有这个我是真的理解不了) 的方案数。[L[i],R[i]][L[i], R[i]][L[i],R[i]] 是满足 L[i]≤i≤R[i],∀j∈[L[i],R[i]],a[j]≥a[i]L[i] \leq i \leq R[i], \fora原创 2021-10-22 13:13:57 · 219 阅读 · 3 评论 -
「快餐店」 题解
题面法一:基环树常规dp和基环树直径一样分两种情况:①:这个点选在树内则找到这个树的根到最远的点(非树内)的距离,和根到最远的点(树内)的距离,两个加起来除以二就是答案。②:这个点选在环上由于是环,不是很好做,所以破环成链,然后考虑这个点选择 [l,r][l, r][l,r] 中 (r=l+len−1)(r = l + len - 1)(r=l+len−1) (lenlenlen:环的长度),容易知道 [最远的距离/选在i点] 的图像是一个单峰函数,所以只需找到第一个 最远点在 [l,pos]原创 2021-09-21 12:01:30 · 179 阅读 · 0 评论 -
Atcoder ABC 216
前言:蛤蛤蛤,我没打的atcoder的比赛都能混不少 ratingD:bak[i]bak[i]bak[i] 表示 iii 在 stack[bak[i]]stack[bak[i]]stack[bak[i]] 的顶部出现过(或者现在就在顶部)。如果发现当前这个数 xxx 的 bak[x]≠0bak[x] \neq 0bak[x]=0,那么这个时候两个 xxx 一定能匹配(因为 stack[bak[x]]stack[bak[x]]stack[bak[x]] 此时一定没有弹走 xxx),那么就把这两个可以原创 2021-09-01 23:09:45 · 410 阅读 · 0 评论 -
错过的比赛——ARC215: D 题题解
1.前言十几天没动了,好不容易找到时间去锻炼一下,结果就错过了比赛,而且自己应该能加大把 rating 的。 /ts2.题解状态定义:这道题很像这道题,所以证明就不写了。假设现在枚举到了 iii, 令 dp[j]dp[j]dp[j] 表示子序列以 a[j]a[j]a[j] 结尾的方案数。状态转移:1. ∀j∈[1,i),a[j]≠a[i]\forall j \in [1,i),a[j] \neq a[i]∀j∈[1,i),a[j]=a[i]dp[i]=(∑k=1i−1dp[k])+1原创 2021-08-23 11:59:33 · 246 阅读 · 0 评论 -
ABC214 F 题题解 + 记一次失败的比赛
1.前言一次失败的比赛。首先为了赶时间(其实也就争取了10min左右),我尝试在出租车上打代码,下来差点吐了 qwqqwqqwq,然后车上因为晕乎乎的,把 DDD 和 FFF 的题意读错了,把 DDD 取 maxmaxmax 读成了求和(然后还嘲讽出题人只会出换根 dpdpdp 板题,并大骂出题人不会出样例,浪费了 20min20min20min 左右),FFF 把不能留下连续的读成了不能删去连续的(然后就放弃 FFF, 撞死在 EEE 题贪心上)。总之虽然外因很多,但主要原因还是自己太菜了呀~。 不久前原创 2021-08-15 19:12:55 · 192 阅读 · 0 评论 -
货币兑换
一.前言这道题不难,但是要用对方法(或者说这才是难点?)二.题解1.郭老师的决策点比较方法郭老师讲的决策点方法通俗易懂,能及其节省脑细胞的解决许多斜率优化的题,但是会遇到负数的困扰,例如这道题,若用郭老师的办法,则会推出下列式子num[j]=dp[j]/(a[j].a∗a[j].Rate+a[j].b);num[j] = dp[j] / (a[j].a * a[j].Rate + a[j].b);num[j]=dp[j]/(a[j].a∗a[j].Rate+a[j].b);dp[i]=Max(原创 2021-05-04 21:23:10 · 153 阅读 · 0 评论 -
关键网线题解
前言虽然这道题并不难,但我还是挺激动的,因为我用上了牛客比赛上学的 一直吃灰 的换根dp,一激之下,猛敲出了这篇题解题解原创 2021-04-09 22:39:50 · 188 阅读 · 0 评论 -
奶牛的跳格子游戏
前言我也没弄懂LJ的意思题解部分题面略;1.状态:dp[i]dp[i]dp[i],表示从 000 开始走到 iii 再走回去所得的钱的最大值2.转移转移方程记 pre[i]pre[i]pre[i] 表示 ∑j=1ia[j](a[j]>0)\sum_{j = 1}^{i} a[j](a[j] > 0)∑j=1ia[j](a[j]>0)则 dp[i]=a[i]+a[j+1]+dp[j]+pre[i−1]−pre[j+1]dp[i] = a[i] + a[j + 1] + dp原创 2021-03-16 17:00:35 · 253 阅读 · 0 评论 -
干草堆题解
一.前言我翻阅了许多blog,都没有讲清楚为什么最底层的宽度最小,高度最高,我决定尝试解释一下,由于本人井中视星,只能大致讲讲证明思路二.证明我们很难从正面去直接解释高度最值的条件,但我们不妨可以使用周老师的 “正难则反” 和柯老师的 “better than anyone”。假设当最底层的宽度为f[i]f[i]f[i]时干草堆最高,如图只需证明最底层宽度变大只会使高度降低而不是升高由于干草堆只能选择连续一段作为同一层,所以如果使底层变宽而又不新添干草堆的方法只能是从上层取出干草堆放入最底层原创 2021-02-09 11:32:18 · 424 阅读 · 0 评论 -
序列的计算 (图解
1.前言被初一巨佬吊打2.1.状态转移方程dp[i][j]=dp[i−1][j]∗(i−j)+dp[i−1][j]∗jdp[i][j] = dp[i - 1][j] * (i - j) + dp[i - 1][j] * jdp[i][j]=dp[i−1][j]∗(i−j)+dp[i−1][j]∗j2.推导分两种情况①:②:综上所述:dp[i+1][j]=dp[i][j]∗(j+1)+dp[i][j−1]∗(i−j+1)dp[i + 1][j] = dp[i][j] * (j + 1)原创 2021-01-14 13:22:11 · 1582 阅读 · 0 评论 -
假日住宿题解
1.题面2.前言太妙了啊太妙了3.分析大体思路:枚举每一条边,每一条边都对应着两个点 (u,v)(u, v)(u,v) ,从这条边断开后,将出现以 uuu , vvv 为根节点的两颗树,我们就将这条边最大化利用,就是将在左子树的人尽可能多的移动到右子树去(这样一定会经过 edge(u,v)edge(u, v)edge(u,v) ),右子树同理,由于每个城市只能由一个人,所以在两颗树上的人交换过去的数量为两棵子树节点数量的最小值。ATTENTION :为什么这样做不会出现一个人多次走一条边的情况呢?原创 2020-10-04 14:17:49 · 297 阅读 · 0 评论 -
【NOIP2018普及组】摆渡车 题解
题面1.前言我记得这是上上上…(此处省略多个“上”字) 次考试的题了,结果我思路想到了,但是没打出来(因为我脑子what了,只用一个变量去完成人家两个数组完成的事,代码十分麻烦,细节也多),这次又双叒花了很长时间去debug。我爱死这个摆渡车了,以后我出去都坐摆渡车2.分析状态: dp[i]表示在i这个时刻,车在人大附中,最小的等车时间和易得 状态转移方程为:dp[i]=min(dp[j]+[j,i]时刻之间的等车时间和)(0<=j<i)dp[i] = min (dp[j] + [原创 2020-10-03 16:03:19 · 780 阅读 · 2 评论 -
多边形题解
题目法1(直接按照题意实现)分析这种方法不是很难…吧。用一个循环枚举从第i个点切开,然后就是一个石子合并 搭配我的bolg食用更佳注意这道题由于有乘号,而负数 * 负数 = 整数,所以要保存一个最小值,还要保存一个最大值代码高亮可能是我写麻烦了,代码非常长#include <queue>#include <cstdio>using namespace std; const int MAXN = 55;const int INF = 0x3f3f3f3f;i原创 2020-06-22 21:54:01 · 302 阅读 · 0 评论 -
石子合并+区间dp初感悟
感悟感觉区间dp和线性dp差别不大,区间dp和线性dp的差别应该是在求求解的顺序有所改变,以石子合并为例题目描述设有N堆石子排成一排,其编号为1,2,3,…,N。每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。例如有4堆石子分别为 1 3 5 2, 我们可以先合并1、2堆,代价为4,得到4 5 2, 又合原创 2020-06-22 13:00:04 · 186 阅读 · 0 评论 -
绝(zhen)世(xiang)好题题解
我好菜啊前言我是真的菜(╥╯^╰╥),挠了半天的头,还是只想到了O(n * n)的算法 不过骗了80分, 头 挠得 疼的实在受不了,搜了一下题解,看了之后看懂了,可觉得讲的不是很详细,秉承着不浪费每一道题的 素质 精神,我决定写篇blog,希望这样也能让我记忆深刻。ps:黎老师连题目名都不改的吗,我搜索能力这么差都搜到了分析我们定义f[i][j]为:在前i个数中选择,以在二进制表示下,第j位为1的最长的序列。那么我们分析一下f[i][j]会由哪些状态转移过来。1.第i个数在二进制表示下的第j位原创 2020-06-16 22:58:58 · 199 阅读 · 0 评论 -
种树的艺术——状态转移方程
题目f[i][j][k]表示树的棵数为i,从左边看过去有j课,从右边看过去有k棵的方案总数从最矮的开始分析1.放在最左边共有f[i - 1][j - 1][k]种方案2.放在最右边共有f[i - 1][j][k - 1]种方案3.放在中间共有f[i - 1][j][k] * (i - 2)中方案状态转移方程:f[i][j][k] = f[i - 1][j - 1][k] + f[i - 1][j][k - 1] + f[i - 1][j][k] * (i - 2)...原创 2020-06-11 14:07:22 · 235 阅读 · 0 评论