随笔分类 - 动态规划
摘要:反思 三维的dp压根没看出来,看题解以后思路又很直观,找几道字符串dp练练才行 序列自动机和优化一维略 C++ / __ __ ____| |_____| |____ | | | __ | | | | include include include include include include i
阅读全文
摘要:要点 反思:以前是在紫书上做过的…… $dp[i][j]$是从1引两条路到达i、j的最大值 为了不相交,则$dp[i][i]$都是非法的,不转移它,也不用它转移 C++ include include include include include include include include i
阅读全文
摘要:要点 ‘&’操作暗示二进制上按位思考 对于y为1的位,要求x和y之间要至少有两个此位为1的(包含x、y),这样&起来才不是0.而这些位中只要存在一个是ok的即可 dp去求每个x的每个位最早到达的y C++ const int maxn = 3e5 + 5, Log = 20; int n, q, a
阅读全文
摘要:思路 “恰k个”考虑求至少k、k+1……个容斥 题面说所有数字都不同,可以将所求转化为糖比药多的组数恰为$(n+k)/2$的方案数 $f[i][j]$数组我觉得更好的理解方式是"前i个已经安排了j组糖大于药、别的先没管"的方案数 $f[n][i] (n i)!$即为把其它的安排了以后的方案数,但是这
阅读全文
摘要:要点 较好的思路解析 $dp[i]$为到达$i$花费的最短时间,$dis[i] dis[j]=lim0$,因为是从头开始在距离上都合法所以不需要队列滑动,只要用变量维护最值即可。
阅读全文
摘要:题目传送 dp是常规的;$m^2$的预处理:把位置存进vector然后$O(1)$算出想要的;WA点:要注意特意设置一下 ,即全天都放鸽子则花费时间为0. C++ include using namespace std; int T, n, m, d, ans; int val[205][205],
阅读全文
摘要:要点 主要学到的东西:一个序列染色,相邻不染同色,恰用$j$种颜色的 1.模式数 、 2.方案数 、 3.具体染色数 。 从大的思路上来讲:先dp预处理出每一层的模式数:$f[i][j]$表示$i$个位置恰染$j$个颜色的 模式数 ,然后再dp出各层之间的转移:$dp[i][j]$表示$i$层恰染$
阅读全文
摘要:要点 $dp[i][j][k]$表示主串已经到第$i$位时,$s$匹配在$j$位、$t$匹配在$k$位的最大得分 本来就要试填一层循环,如果转移也写在循环里的化复杂度承受不了,于是开两个表kmp预处理一下。 C++ include include include using namespace st
阅读全文
摘要:要点 非要先来后到暗示多源最短路,求最小的最大值暗示二分 二分内部的check是关键,dp处理一下,$dp[i]$表示第$i$笔订单最早何时送达,如果在ddl之前到不了则$return\ 0$。我觉得其中$time$变量的维护很好地使复杂度降了一维。 第一发WA点:算法看了一遍感觉没有可改的,就把二
阅读全文
摘要:要点 处于什么位置的题常用一个套路就是搞完$[l,r]$以后处于0(l)或1(r)的状态,即$dp[i][j][0/1]$。 对于此题dp意义为已经搞完$[l,r]$的时最小的已耗电能,转移:以在$i$处为例,只会是$i+1$处直走过来或者$j$处掉头过来两种。写就很好写了。 C++ include
阅读全文
摘要:常规线性dp,需要时就加一维。$dp[i][j][t][s]$表示在点$(i,j)$时瓶子里剩$t$且为$s$走(0代表小a,1代表uim)时的方案数。 de了半天发现是初次尝试的快速取模少写个等号……然鹅改了以后为什么比正常写跑得慢…… C++ include const int mod = 1e
阅读全文
摘要:要点 $\sum{w_i} rhs.w; } }a[maxn]; int dp[maxw]; int main() { read(n), read(d); rep(i, 1, n) { read(a[i].l); read(a[i].w); read(a[i].h); } sort(a + 1, a
阅读全文
摘要:要点 优质题解 因为只有某type坏人全部分布在同一撇时,才能一次消灭。所以题目安排完毕后一定是type(x)和type(y)占一半,其余占另一半。 实际情况只有52 52种,则预处理答案 枚举某两种,并连续两次使用退背包得到无排列的方案数,真·答案是有排列的,乘上一个排列数即可,而根据式子,排列数
阅读全文
摘要:要点 寻找最多边的匹配的结论:贪心地从叶子开始找,最后答案都是奇数层下边的那条边。 设$dp[i][j]$表示当前长度为$i$,平衡度为$j$,平衡度为 数量减去 数量。 增加左右括号转移,并将奇数层合法的加到ans中。 C++ include const int maxn = 1005, mod
阅读全文
摘要:要点 题意:两个数据传输数列,每个数列里有若干个数据包并给出发出时间$t$,每个数据包到达的时间$T$是$t include using std::vector; typedef long long ll; const int maxn = 5e4 + 5; const int mod = 1e9
阅读全文
摘要:$dp[v][k]$代表以$v$的子树为起点,以点$v$为终点长度为$k$的方案有多少种。 转移只需将子树加和;计算$ans$由两部分组成,一是$dp[v][k]$,另一部分是经过$v$的方案数。 C++ include include using std::vector; const int ma
阅读全文
摘要:要点 设$f[i][j][k]$为 经过点$(i,j)$且包含点集$k$ 的最小代价,其中k是指景点集合的枚举。 考虑有两种情况:1.点$(i,j)$作为关键点连接了两个子集时$f[i][j][k]$可以得到最小,有$f[i][j][k]=f[i][j][k_1]+f[i][j][k_2] a[i]
阅读全文
摘要:二分答案,内部01背包一下重量大于等于W的最大价值是否大于等于0了。
阅读全文
摘要:常规dp。看到数据很小就直接暴力了,没有预处理。kmp好像过分了…… C++ include include include include include include using namespace std; int n, k, t, dp[205][45]; string T = " ",
阅读全文