定义一种加法,没有进位,进行的方式就是按位做加法,然后把结果落下来。给定一个结果,有m个操作,每个操作会把这个结果的某一位换成另一个数字,每次操作都询问有多少组加数可以得出这个结果。
我们设$dp_i$为到第$i$位结果有多少种加数组合,显然有转移方程$dp_i = dp_{i-1}\times (t_i+1) + [10\leq t_{i-1}\times 10 + t_i\leq 18]dp_{i-2}\times (19 - t_{i-1}\times 10 - t_i)$
这个东西显然可以用矩阵乘法转移,所以对于修改的操作上矩阵乘法线段树就可以。
给定一个01串,对01串进行操作,操作定义为选择两个相邻的字符,保留较大的那个,删去另一个,问经过若干次操作可以得到多少种本质不同的01串。
我们假设我们经过若干次操作获得了一个结果t,我们应该怎样确定是否能得到这个t呢。我们假设现在已经用了s的前i位,匹配到了t的前j位,如果t的第j+1位时1,那么我们找出s后面第一个1匹配上即可。如果是0,我们需要考虑t里有一段多长的连续的0,假设是k为,那么就需要匹配一段长度为k的0。所以我们现在知道可以贪心构造01串。
所以我们按照这个贪心的思想进行dp,$dp_i$表示有多少个串t能够贪心匹配到s的第i位,按照原方法考虑01两种情况进行转移即可。
给定n个线段,每个线段都有一个颜色,总共有两种颜色。
我们定义一种坏的线段对为两个线段颜色不相同同时有相交的部分。
问最多可以选择多少个线段同时两两不为坏的线段对。
这个题目的dp解法应该是先把线段按照右端点排序,设状态$dp_{i,j}$,代表结束位置为i,颜色为j的情况最多能选多少个线段,然后靠线段树转移即可。但是除了dp解法之外还有一种更简单的做法,我们可以考虑把线段看做点,然后在坏的线段对之间连一条边,这样我们去求最大独立集就是这道题的答案。
而关于这道题的匹配,只需要按照右端点排序,选取预期相交的r最小的不同颜色线段匹配即可得到最大匹配,n-最大匹配就是最大独立集了。
给定一颗树,树上每个点都有一个高度值$h_i$和一个价值$t_i$,现在要求选若干条链,链上的点高度值单调,使得每一条边都仅被选择一次,问怎样选择能使选择的链的价值和最小(链的价值为链上所有点价值之和)。
考虑对于树上的一条边,如果边两侧的高度不同,那么这条边就已经有了方向,从高度低的一侧指向高度高的一侧,如果所有的边都已知方向,那么这个问题的答案就是$\sum min(ind_i,outd_i)\times t_i$。那么要解决的就是不知道方向的边。我们考虑dp,设$f_u$为$fa_u\rightarrow u$时删去点的最大值,$g_u$为$u\rightarrow fa_u$时删去点的最大值,最后答案就是$\sum t_i\times 2$减去每一颗高度相同边组成的树的根节点的f
给定一个长度为n的字符串,里面有01和?三种字符,0代表a赢了一局游戏,1代表b赢了一局游戏,?代表不知道这局游戏的结果,现在我们定义x度游戏为两个人对决,有一个人赢了x轮游戏就结束,现在问对于$x=1,2…n$,他们最多能举行多少轮游戏。
我们设$dp_i$为到第i局最多能进行$dp_i$次x轮游戏,我们知道转移只需要枚举上一次结束的位置,然后判断上一次位置到当前位置之间0和1个数较多的那一个加上问号的个数是否大于等于x就行,如果是就在上一次结束的基础上加一。这个东西可以转换为一个贪心,然后用预处理加速,最后算一下复杂度是$O(nlogn)$的。