[算法模版]子序列DP】的更多相关文章

[算法模版]子序列DP 如何求本质不同子序列个数? 朴素DP 复杂度为\(O(nq)\).其中\(q\)为字符集大小. \(dp[i]\)代表以第\(i\)个数结尾的本质不同子序列个数.注意,这里对于每一个字符,只计算上一个相同字符带来的贡献.如果全部计算的话会算重复. 最后统计答案的时候也只统计每个字符最后一次出现的位置的答案. 例题:[线上训练13]子序列 中的50分部分分 #include<iostream> #include<cstdio> #include<cstr…
/* 网络流之最大流Dinic算法模版 */ #include <cstring> #include <cstdio> #include <queue> using namespace std; ; const int inf = 0x3f3f3f3f; struct { int c,f;//c为边的容量,f为边的容量 }edge[maxn][maxn]; int dis[maxn]; int v,e; bool bfs()//利用bfs进行分层处理,当汇点无法分层时得…
最大连续子序列 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 42367    Accepted Submission(s): 19198 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j…
[算法模版]Tarjan爷爷的几种图论算法 前言 Tarjan爷爷发明了很多图论算法,这些图论算法有很多相似之处(其中一个就是我都不会).这里会对这三种算法进行简单介绍. 定义 强连通(strongly connected): 在一个有向图\(G\)里,设两个点a, b 发现,由\(a\)有一条路可以走到\(b\),由\(b\)又有一条路可以走到\(a\),我们就叫这两个顶点(a,b)强连通. 强连通图: 如果 在一个有向图\(G\)中,每两个点都强连通,我们就叫这个图,强连通图. 分量:把一个…
[算法模版]Prim-完全图最小生成树 众所周知,对于常用的Kruskal算法,算法复杂度为\(O(m \log m)\).这在大多数场景下已经够用了.但是如果遇到及其稠密的完全图,Prim算法就能更胜一筹. Prim算法也可以使用很多数据结构进行优化.但是对于完全图来说,这写优化都无足轻重.暴力的Prim算法的\(O\left(n^{2}+m\right)\)就足够了. Prim算法也很简单.就是每次考虑把一个加入一个点到已经建成的生成树.可以证明如果选择一个不在当前生成树,且离当前生成树最近…
[算法模板]SOS DP 正文 SOS-DP(\(\text{Sum over Subsets}\))是用来解决这样的问题的: 其实就是子集和DP.上面每个\(F[mask]\)里面包含了\(mask\)所有二进制子集的信息.这是一种\(n\log_2 n\)的DP方法. 我们定义一个DP状态\(S(mask,i)\)代表\(mask\)子集中只有最靠右的\(i\)位与其不同的状态. 具体是这样的: 图中描述了\(S(10110,4)\)这个状态和其所有儿子之间的关系. 形象一些解释就是每次我们…
[算法模版]AC自动机 基础内容 板子不再赘述,OI-WIKI有详细讲解. \(query\)函数则是遍历文本串的所有位置,在文本串的每个位置都沿着\(fail\)跳到根,将沿途所有元素答案++.意义在于累计所有以当前字符为结尾的所有模式串的答案.看代码就能很容易的理解. 另外\(e[i]\)记录的是第\(t\)个模式串结尾是哪个节点(所有节点均有唯一的编号). 贴个P5357 [模板]AC自动机(二次加强版)板子: #include<iostream> #include<cstdio&…
[算法模版]Link-Cut-Tree 博主懒本博客只对现有博客进行补充,先直接放隔壁链接. FlashHu-LCT总结 Menci-LCT学习笔记 make-root操作 make-root操作用于把任何一个点反转到当前树的根节点. 做法是先把要进行操作的节点x进行access,将root和x进行连通.然后进行splay(x)操作,把x变成splay的根.(请注意,这时候x在主树的深度仍然没有改变). 随后将x的子树全部进行反转操作.也就是改变了这个splay的深度.虽然splay和splay…
模版 动态 dp 终于来写这个东西了.. LG 模版:给定 n 个点的数,点有点权, $ m $ 次修改点权,求修改完后这个树的最大独立集大小. 我们先来考虑朴素的最大独立集的 dp \[dp[u][0] = \sum_v max\{dp[v][1],dp[v][0]\}\\dp[u][1] = val[u] + \sum_v dp[v][0] \] 现在我们就拥有了一个 $ O(nm) $ 的做法,但是明显它不优秀. 既然支持修改,我们可以考虑树剖(或者LCT),现在树被我们剖成了重链和轻链.…
1. 对于序列x[1,i]和y[1,j],推导递推公式1.a 假设当前元素同样,那么就将当前最大同样数+12.b 假设当前元素不同.那么就把当前最大同样数"传递"下去 因此递推公式为: x[i] == y[j] : dp[i][j] = Max(dp[i-1][j-1],dp[i][j-1],dp[i-1][j]) + 1 x[i] != y[j] : dp[i][j] = Max(dp[i][j-1],dp[i-1][j]) 因为x[i]!=y[j]的情况不难能够对x[i]==y[j…