
区间dp
C202044zxy
这个作者很懒,什么都没留下…
展开
-
[unknown source] Random IS
一、题目给你一个数组 aaa,其中有 nnn 个元素。你现在要标记若干个元素,使得它们单调上升。你按照下面两个步骤来进行操作:step1\tt step1step1:如果一个元素称为好元素,当且仅当它被标记以后,标记过的元素仍然是单调上升的。设有 kkk 个好元素。step2\tt step2step2:从 kkk 个好元素中随机选一个进行标记,然后跳到 step1\tt step1step1,如果 k=0k=0k=0,则将所有未标记的元素删除,结束操作。问最后期望的元素个数是多少?取模 1e9+7原创 2020-11-25 17:31:53 · 277 阅读 · 0 评论 -
[unknown OJ] 甲虫
`1原创 2020-11-25 08:50:16 · 173 阅读 · 0 评论 -
[unknown OJ] 客星璀璨之夜
一、题目点此看题二、解法这个样例我佛了,第二个等差数列,第三个等等差数列,没把我考试的错误测出来。直接讲正解,设dp[i][j]dp[i][j]dp[i][j]为行星iii到jjj,把他们撞完的期望距离和,理解一下这个状态,首先一定会剩下一个恒星,记第iii行星左边的恒星是iii,这样无论怎么撞都不会撞出恒星[i,j+1][i,j+1][i,j+1]考虑转移,我们严格按照题目要求进行,枚举当前状态下第一个去撞击的行星,枚举他往左边撞还是右边撞,这样就产生了2(j−i+1)2(j-i+1)2(j−i原创 2020-10-06 16:41:51 · 560 阅读 · 2 评论 -
CF888F Connecting Vertices
一、题目点此看题二、解法一开始有一个很直接的想法,设dp[i][j]dp[i][j]dp[i][j]为建出区间[i,j][i,j][i,j]的生成树的方案,转移:选中间的一个点作为桥梁:∑dp[i][k]×dp[k][j]\sum dp[i][k]\times dp[k][j]∑dp[i][k]×dp[k][j]本来是两部分,连了[i,j][i,j][i,j]之后合并了:∑dp[i][k]×dp[k+1][j]\sum dp[i][k]\times dp[k+1][j]∑dp[i][k]×dp[原创 2020-07-29 10:32:56 · 244 阅读 · 0 评论 -
CF1107E Vasya and Binary String
一、题目点此看题二、解法巧妙的定义,我可能这辈子都想不到。设dp[i][j][k]dp[i][j][k]dp[i][j][k]为区间[i,j][i,j][i,j]右边有kkk个和jjj颜色相同的格子,转移:删去jjj和后面kkk个格子:dp[i][j][k]=dp[i][j−1][0]+v[k+1]dp[i][j][k]=dp[i][j-1][0]+v[k+1]dp[i][j][k]=dp[i][j−1][0]+v[k+1]枚举一个和jjj颜色相同的格子ppp:dp[i][j][k]=dp[i原创 2020-07-29 10:19:13 · 187 阅读 · 0 评论 -
CF838E Convex Countour
一、题目点此看题原创 2020-07-29 09:38:31 · 278 阅读 · 0 评论 -
CF49E Common ancestor
一、题目点此看题二、解法设dp[i][j]dp[i][j]dp[i][j]为最少的s3s_3s3大小,能生成s1s_1s1的前iii个,s2s_2s2的前jjj个,转移:dp[i][j]=dp[k−1][l−1]+1dp[i][j]=dp[k-1][l-1]+1dp[i][j]=dp[k−1][l−1]+1转移的条件是存在字符www能生成s2[k,i],s3[l,j]s_2[k,i],s_3[l,j]s2[k,i],s3[l,j],这个需要再处理一下。设ok1[i][j][w]ok1[i原创 2020-07-28 19:25:10 · 187 阅读 · 0 评论 -
CF1178F1 Short Colorful Strip
一、题目点此看题二、解法设dp[l][r]dp[l][r]dp[l][r]为现在还没有涂色,涂色完[l,r][l,r][l,r]的方案数,关键是转移。由于题目明说了染色是按颜色顺序从小到大,所以转移可以从这个区间最小的颜色入手,这个最小的颜色会把区间划分成444部分(因为这个点染完就固定了,是不可跨越的,就达到了分裂区间的效果),转移枚举染色段的左端点iii和右端点jjj,设最小的颜色位置是ppp:dp[l][r]=dp[l][i−1]×dp[i][p−1]×dp[p+1][j]×dp[j+1][原创 2020-07-28 15:04:42 · 282 阅读 · 0 评论 -
CF1025D Recovering BST
一、题目点此看题二、解法考虑暴力做法,设f[l][r][u][0/1]f[l][r][u][0/1]f[l][r][u][0/1]表示[l,r][l,r][l,r]作为uuu的左儿子///右儿子是否合法,但是这种做法在n<=700的数据中会MLE。考虑压缩无用的状态,由于我们需要构造的是一颗二叉搜索树,所以一段区间[l,r][l,r][l,r]如果作为左儿子,那么根一定是r+1r+1...原创 2020-02-01 14:03:39 · 154 阅读 · 0 评论 -
CF1336C Kaavi and Magic Spell
一、题目点此看题二、解法题目中的前缀,放前放后提示我们可以用区间dpdpdp了(虽然我也看不太出来)设dp[l][r]dp[l][r]dp[l][r]为SSS的前r−l+1r-l+1r−l+1项去填TTT的[l,r][l,r][l,r](可能超过mmm,但超过的话就随便填),转移就看s[r−l+1]s[r-l+1]s[r−l+1]能不能填到lll位置上,能不能填在rrr位置上。答案是∑i=mndp[1][i]\sum_{i=m}^n dp[1][i]∑i=mndp[1][i]#include &原创 2020-07-28 11:39:54 · 228 阅读 · 0 评论 -
CF1312E Array Shrinking
一、题目点此看题二、解法如果一个区间能化成一个数,那么这个数是固定的,我们可以用区间dpdpdp的方式O(n3)O(n^3)O(n3)地把它算出来。然后问题就变成了前iii个数化成最少的段,使每个段都能化成一个数,暴力dpdpdp是O(n2)O(n^2)O(n2)的。#include <cstdio>#include <iostream>using namespace std;const int M = 505;int read(){ int x=0,fl原创 2020-07-28 08:54:21 · 180 阅读 · 0 评论 -
CF39C Moon Craters
一、题目点此看题二、解法把每个圆表示成线段覆盖,判断相不相交只需要比较大小,所以我们可以先离散化。考虑使用区间dpdpdp,但一定要想清楚区间指的是什么,一开始我把区间理解成连续的若干个圆,发现根本做不动。而本题显然把区间理解成数轴上的区间更好做,定义dp[i][j]dp[i][j]dp[i][j]为区间[i,j][i,j][i,j]最多的圆数量,转移:dp[i][j]=dp[i][x]+dp[x][j]+g[i][j]dp[i][j]=dp[i][x]+dp[x][j]+g[i][j]dp[i]原创 2020-07-28 10:31:19 · 932 阅读 · 1 评论