随笔分类 - 算法->DP
一些没有什么特定类别的dp
    
摘要:A Candy Distribution Again 大意:有x个糖给n个小朋友,必须分完,小朋友得到糖数为一个确切值的时候小朋友会开心,求最多的开心数 题解 直接排序然后贪心分,如果分到最后一个有剩余那么开心数 1即可 代码 B Garbage Collector 大意:有一个机器人从0点出发,有
        阅读全文
                
摘要:题解 遇见平方和就转有序对呗 dp类似从很多点出发每次走一步的转移方式 然后我too naive的,枚举路径长度来决定更新次数,愉快TLE 改成记搜就过了 代码 cpp include define fi first define se second define pii pair define m
        阅读全文
                
摘要:题解 题中给的函数可以用矩阵快速幂递推 我们记一个数组dp[i](这个数组每个元素是一个矩阵)表示从1到i所有的数字经过拆分矩阵递推的加和 转移方法是 $dp[i] = \sum_{j = 0}^{i 1} dp[j] tr[j + 1][i]$ $tr[j][i]$表示矩阵的$[j,i]$组成的数
        阅读全文
                
摘要:题解 把所有=的点连起来,一个图合法肯定它是一个有向树森林 我们新建一个点,把这个点和其他所有树的树根连起来 定义$dp[u][j]$表示第u个点长度为j的序列的方案数 转移方法是 $dp[u][j] += g[k] \cdot dp[v][h] \cdot \binom{j}{k} \cdot \
        阅读全文
                
摘要:题解 如果不加这条边,那么答案是所有点入度的乘积 加上了这条边之后,我们转而统计不合法的方案数 就是相当于统计一条路径从y到x,新图所有点度的乘积除上这条路径所有点的点度乘积 初始化为$f[y] = \frac{\prod_{i = 2}^{n} ind[i]}{ind[y]}$ 转移按照拓扑序转移
        阅读全文
                
摘要:题解 那个限制表示一回头要治完前面的所有病人 我们处理一个g[i][j]表示治疗i到j的病人至少会死多少病人 $g[i][j] = g[i + 1][j] + sum[i + 1,j] + min(sum[i + 1,j],(i j) 3 a[i])$ 每次新加一个i,要么治疗i要么转一圈回来再治 
        阅读全文
                
摘要:题解 用所有的方案减去有界的方案 我们规定两个前缀后缀相同时长度最短的,设长度为l,因为长度最短所以他们也是无界单词,可以递推 $f[i] = \sum_{j = 1}^{\lfloor \frac{i}{2} \rfloor} f[j] 2^{i 2 j}$ 计算第k大的时候同理,只需要先对枚举的
        阅读全文
                
摘要:题解 少考虑了情况,导致我以为是暴力讨论一次角落移动 de了两天才反应过来……简直降智 事实上,我们把移动分三类,一种是在边界跳过一段,一种是在左上角上左上左上左这样撞墙,在右下角下右下右下右这么撞墙,另一种是左右左右左右这么撞墙 如果你说还有上下上下这么撞墙,就把整个图旋转180度再做一遍dp就好
        阅读全文
                
摘要:题解 c一样的就是一个独立的游戏 我们对于2和3的指数 sg[i][j] 表示$c \cdot 2^i \cdot 3^j$的棋子,只有这个硬币是反面,翻转的硬币是正面的sg值 枚举sg函数所有可能的局面,每个后继局面的sg值,就是所有被翻到背面的硬币sg值的异或和 我们忽略了反转当前硬币前面可能不
        阅读全文
                
摘要:题解 这个我们处理出来每一位能变化到的最大值和最小值,包括自身 然后我们发现 $f[i] = max(f[i],f[j] + 1) (mx[j] define enter putchar('\n') define space putchar(' ') define pii pair define f
        阅读全文
                
摘要:题解 可持久化可并堆 用$f[i,j]$表示最大的质数标号为i,然后有j个质数乘起来 用$g[i,j]$表示$\sum_{k = 1}^{i}f[k,j]$ 转移是 $f[i,j] = \sum_{k= 1}^{j} g[i 1,j k] p_{i}^{k}$ $g[i,j] += f[i,j]$ 
        阅读全文
                
摘要:题解 由于强化卡都是大于1的,我们分析一下就会发现,尽可能多的用强化卡,至少用一张攻击卡,一定是每组卡牌的最优选择 所以我们把攻击卡和强化卡从大到小排序 我们设$g[i][j]$表示前i张卡牌里选择j张强化卡,能强化的倍数之和 如果$j include include include include
        阅读全文
                
摘要:题解 一道神奇的dp 我们发现关于两个东西的记录很难办,但是我们发现在固定时间区间内,如果A场地举办的活动数是一定的,那么B场地肯定举办的活动越多越好 我们预处理一个$num[i][j]$表示时间区间$[i,j]$有多少个活动会在这个区间里举办(被区间完整包含) $pre[i][x]$表示$[1,i
        阅读全文
                
摘要:题解 显然是个$n^2$的dp 我们要找每个点不穿过非赛道区域能到达哪些区域的交点 可以通过控制两条向量负责最靠下的上边界,和最靠上的下边界,检查当前点在不在这两条向量之间即可,对于每个点可以$O(n)$求出来哪些点是可以到达的 之后dp即可 注意判断S点所在区域的时候需要找靠后的那个区域…… 代码
        阅读全文
                
摘要:题解 用$f[i][j]$表示考虑了前i个排名有j个人被碾压 $f[i][j] = f[i 1][k] \ C[k][j] \ C[N k 1][N r[i] j] \ P[i]$ P[i]是成绩排列的方式,意义是在前面k个人里选了j个来碾压,并将人数空缺用上一次没有碾压的来填补 $P[i]$怎么求
        阅读全文
                
摘要:题解 听说是什么序列自动机? 我们考虑对于每个位置的串,下面拼接相同的字符时,拼接最近的一个,这样可以保证不重不漏 为了实现这个我们需要什么呢,我们需要一个链表,记录一下每个位置的下一个字符会转移到哪里 例如 ABAB ch[1]['A'] = 3 ch[1]['B'] = 2 听起来挺好建的,具体
        阅读全文
                
摘要:题解 有意思的一个dp,我们对G计数,发现如果不在同一条对角线上的G肯定不会互相影响,所以我们对于每一条对角线dp dp的方式是枚举这个G以什么方式放,横着还是竖着,还是不放 代码 cpp include include include include include include include
        阅读全文
                
摘要:题解 这道题很显然可以想出来一个$n^2$的dp,也就是dp[u][i]表示以u为根的子树最大值是i的点集最大是多少(i是离散化后的值) 就是对于每个儿子处理出后缀最大值然后按位相加更新父亲,我们把最大值处理成差分来存储,儿子们的最大值按位相加等于差分按位相加,后缀最大值出现了变化仅当加入了父亲节点
        阅读全文
                
摘要:题解 一个小数的一百多次方也没有爆,exm??? 这个如果单看题面的话,这题非常的不好搞(什么题能告诉你它好搞 include include include include include include // define ivorysi define pb push_back define s
        阅读全文
                
摘要:题解 假如我们非常熟练的看出来,平方和转有序对统计的套路的话,应该就不难了 我们只需要统计(wayA,wayB)生成的序列一样的有序对个数就行 可以用一个$n^3$的dp解决 $dp[i][j][k]$表示选到第i个,第一个序列用j个上管道的球,第二个序列用了k的上管道的球,要求下一次操作两个球长得
        阅读全文
                
 
                    
                     
                    
                 
                    
                
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号