随笔分类 -  动态规划—dp

摘要:分情况讨论,m=1的时候比较简单,设f[i][j]为到i选了j个矩形,前缀和转移一下就行了 m=2,设f[i][j][k]为1行前i个,2行前j个,一共选了k个,i!=j的时候各自转移同m=1,否则转移一下两行矩阵的情况 cpp include include using namespace std 阅读全文
posted @ 2018-09-23 21:59 lokiii 阅读(128) 评论(0) 推荐(0)
摘要:设f[i][j][k][0/1]表示选到i时,i 1选j张,i选k张,之前选的所有牌是否选择了对子 然后分情况讨论转移即可 阅读全文
posted @ 2018-09-23 21:38 lokiii 阅读(165) 评论(0) 推荐(0)
摘要:设f[i]为深度为i的n元树数目,s为f的前缀和 s[i]=s[i 1]^n+1,就是增加一个根,然后在下面挂n个子树,每个子树都有s[i 1]种 写个高精就行了,好久没写WA了好几次…… 阅读全文
posted @ 2018-09-23 21:26 lokiii 阅读(108) 评论(0) 推荐(0)
摘要:有点神奇的dp 首先注意到任意一个数都能被表示成若干个斐波那契数的和的形式 先求出n可以字典序最大的表示 设f[i][0/1]表示第i个斐波那契数选或者不选 如果当前数不选,那就选比他小的两个数,否则,需要不选比他小的两个数(连续的影响) 阅读全文
posted @ 2018-09-23 20:12 lokiii 阅读(173) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-09-23 15:34 lokiii 阅读(3) 评论(0) 推荐(0)
摘要:设f[i][j]为a序列前i个字符和b序列前j个字符的最长公共子序列,转移很好说就是f[i][j]=max(f[i 1][j],f[i][j 1],f[i 1][j 1]+(a[i]==b[j])) 设g[i][j]为a序列前i个字符和b序列前j个字符的最长公共子序列个数,这个转移是转移f的时候从前 阅读全文
posted @ 2018-09-22 19:59 lokiii 阅读(189) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-09-20 09:24 lokiii 阅读(1) 评论(0) 推荐(0)
摘要:二分答案,注意l是max(a[i]+a[i+1]),r是sum_a 判断的时候用dp,设f[i]为i与1最少的相同颜色数,g[i]为i与1最多的相同颜色数,转移是f[i]=max(a[i] (w a[i 1] (a[1] g[i 1])),0),g[i]=min(a[1] f[i 1],a[i]); 阅读全文
posted @ 2018-09-18 16:45 lokiii 阅读(182) 评论(0) 推荐(0)
摘要:注意到sum_t比较小,所以设f[i][j]为选前i头牛,当前sum_t为j的最小sum_w值,转移是f[i][j]=min(f[i 1][j],f[i 1][j t[i]]+w[i]),然后i维用滚动数组优化即可 注意j include include using namespace std; c 阅读全文
posted @ 2018-09-17 09:40 lokiii 阅读(160) 评论(0) 推荐(0)
摘要:注意到周期234的lcm只有12,也就是以12为周期,可以走的状态是一样的 所以先预处理出这12个状态的转移矩阵,乘起来,然后矩阵快速幂优化转移k/12次,然后剩下的次数暴力转移即可 cpp include include include using namespace std; const int 阅读全文
posted @ 2018-09-15 10:17 lokiii 阅读(156) 评论(0) 推荐(0)
摘要:设f[i]为凑i元的方案数,这个随便dp一下就行了 然后处理限制,我们考虑用容斥,也就是4个超限 3个超限+2个超限 1个超限,这里用状压枚举一下,然后i硬币超限就当做选了d[i]+1个,在s里减去,最后用来容斥的就是f[s'] 阅读全文
posted @ 2018-09-14 15:46 lokiii 阅读(135) 评论(0) 推荐(0)
摘要:很容易发现行数就是lcm环长,也就是要求和为n的若干数lcm的个数 有结论若p1^a1+p2^a2+...+pm^am include using namespace std; const int N=1005; int n,p[N],tot; long long f[N][N]; bool v[N 阅读全文
posted @ 2018-09-14 10:48 lokiii 阅读(157) 评论(0) 推荐(0)
摘要:bzoj上访问负下标会跑到奇怪的地方…… 其实可以滚动数组优化,但是我看能过就懒得改了 设f[i][j]为已经算了前i个挂饰,当前有j个空的钩子,转移就是f[i][j]=max(f[i 1][j],f[i 1][max(min(j a[i]+1,n), n)]+b[i]) 注意到只有 n inclu 阅读全文
posted @ 2018-09-12 19:38 lokiii 阅读(116) 评论(0) 推荐(0)
该文被密码保护。
posted @ 2018-09-11 20:34 lokiii 阅读(2) 评论(0) 推荐(0)
摘要:设f[i]为杀死i的最小代价,显然\\( f[i]=min(k[i],s[i]+\sum f[to]) \\) 但是这个东西有后效性,所以我们使用spfa来做,具体就是每更新一个f[i],就把能被它更新的点重新入队 cpp include include include include using 阅读全文
posted @ 2018-09-10 08:23 lokiii 阅读(157) 评论(0) 推荐(0)
摘要:设f[a][i][j]为第a段时间结束时在(i,j)位置的最长滑行距离,转移很好想,就是分四个方向讨论,然后枚举这段时间的滑行长度取个max即可 但是这样是O(n^4)的,考虑优化 发现同一行或列,取max对应a 1中的是单调挪动的一个区间,所以用单调栈维护当前区间,每次移动的时候要把左端点已经大于 阅读全文
posted @ 2018-09-09 20:09 lokiii 阅读(161) 评论(0) 推荐(0)
摘要:设f[i][j]为在坐标(i,j)时的最小点击次数,转移的话从i 1向上飞或者向下掉转移,注意转移完了之后要把管子部分赋值为inf cpp include include using namespace std; const int N=10005,inf=1e9; int n,m,k,p,ans, 阅读全文
posted @ 2018-09-09 17:44 lokiii 阅读(133) 评论(0) 推荐(0)
摘要:矩阵乘法一般不满足交换律!!所以快速幂里需要注意乘的顺序!! 其实不难,设f[i]为i的答案,那么f[i]=(f[i 1] w[i]+i)%mod,w[i]是1e(i的位数),这个很容易写成矩阵的形式,然后按每一位分别矩阵快速幂即可 矩阵: f[i 1] w[i] 1 1 f[i] i 1 0 1 阅读全文
posted @ 2018-09-07 16:51 lokiii 阅读(114) 评论(0) 推荐(0)
摘要:https://blog.sengxian.com/solutions/bzoj 1444 orz 一直是我想错了,建出AC自动机之后,实际上这个定义是设f[i]为经过i节点的 期望次数 ,因为单词末尾节点走到意味着游戏结束,所以经过单词末尾节点的概率就是经过单词末尾节点的期望次数。为什么是期望呢, 阅读全文
posted @ 2018-09-07 08:20 lokiii 阅读(193) 评论(0) 推荐(0)
摘要:好像是高斯消元解互相推(?)的dp的例子 首先考虑dp,设f[i][j]为一人在i一人在j的概率,点i答案显然就是f[i][i]; 然后根据题意,得到转移是 $$ f[i][j]=f[i][j] p_i p_j+\sum_{edge(x,i)\in E}f[x][j] p_j \frac{1 p[x 阅读全文
posted @ 2018-09-06 19:37 lokiii 阅读(140) 评论(0) 推荐(0)