规划---动态规划
树形
小松萘
厉害的人可真多啊
展开
-
算法复习 - AcWing动态规划
1027. 方格取数从左上角走到右下角,能走两次,问你最大收益,两条路如果走到同一个点就只有一份收益特殊情况就是两条路重复的时候,重复的必要条件是两条路走的步数相等,为了方便维护这个值,DP维护的状态中保存当前走的总步数和第一二条路向右走的步数,这样向下走的步数可以直接计算出,状态转移就很明显了就/*dp[i1][i2][k]: 第一个点走到(i1,k-i1),第二个点走到(i2,k-i2)的最大值dp[i1][i2][k] 可由 dp[i1][i2][k-1],dp[i1-1][i2][k-1原创 2020-10-03 21:11:01 · 263 阅读 · 1 评论 -
CodeForces - 1353F Decreasing Heights (DP,思维)
???? ???? ????题意一个n*m的矩阵,每一个位置都有一定的高度,要求从(1,1)走到(n,m)并且每次移动只能向下或者向右移动,并且要求只能向比自己高度高1的位置移动。定义一个操作:执行一次可以使得任意一个格子的额高度减一,问从1,1到n,m操作的最少次数。分析考虑如果不做操作,就是一道很经典的dp,所以现在需要确定的是,操作结束之后的矩阵。(1)首先一定会有一个格子的高度保持不变(2)由起点的高度可以推得所有格子的高度(3)所以我们枚举高度不变的格子,依据他计算出起点高度,之后枚原创 2020-05-26 18:16:47 · 161 阅读 · 0 评论 -
CodeForces - 1353E K-periodic Garland (动态规划)
成为你想当的那种人,没有时间限制,随时都能开始。题意一个长为n的01串,翻转多少次能满足 1 周期出现,如k = 3时,“00010010”, “1001001”, “00010” and "0"满足要求分析可以看出最后转换出的串满足是这样的,前面后面一部分零,中间是循环串,设dp[ i ]为使1 ~ i 部分满足要求且i位置为1的最小步数,有两种转移状态,一种是该位置填1且前面全填0,另一种是和i - k 连接构成循环串,计算ans的时候算上后面全是0即可代码char s[MX];int d原创 2020-05-26 16:19:11 · 145 阅读 · 0 评论 -
CodeForces - 1082E Increasing Frequency(DP)
题意:可以选一段区间[ l , r ],将该区间全部加上k,问你这样操作一次之后数组中最多能有多少数字等于c(1)假设我们要对[l,r]区间操作,那么必须保证a[l]+k=c,否则我们可以把原区间缩成[l+1,r],r同理,由此可知我们选出的一段区间[l,r]必须满足a[ l ] = a[ r ],且加的k也是固定的。进一步推得考虑该问题时应该分数字讨论(2)考虑现在选出一段区间[l,r],对...原创 2020-04-12 15:55:04 · 160 阅读 · 0 评论 -
CodeForces - 1084D The Fair Nut and the Best Path (树形DP)
????♂️ ????♂️ ????♂️树形DP维护一个点向下走的最大值和次小值即可#define int llint n;vector<pair<int,int> >mp[MX];int w[MX];int mx[MX][2];//0:某点向下走的最大路径1:某点向下走的次大路径void dfs(int x,int fx){ mx[x][0]=w[x],mx...原创 2020-04-10 13:47:55 · 117 阅读 · 0 评论 -
AcWing 350. 巡逻(树的直径-----BFS与DP版本)
???? ???? ????让你在一颗树上加1/2条边,从1点开始走,新形成的图每个边经过至少一次需要走几步(1)如果不能加边,考虑dfs这颗树,很明显是2*(n-1)(每个边都需要走两遍)(2)如果可以加一条边,加了改边之后形成环,改环上的边只需要走一次即可,贪心的想我们肯定加在直径上(3)如果可以加两条边,这时候如果加了改边形成的环和上一个环有重叠,为了经过新加的这条边,我们需要把两环重叠的部分再...原创 2020-03-28 17:30:42 · 169 阅读 · 0 评论 -
POJ - 1985 Cow Marathon (树的直径-----DP版)
???? ???? ????看这个搞懂的int n,m;ll ans;ll dp[MX];//iint head[MX],tot;struct IN{int v,w,nxt;}edge[MX<<1];void add(int u,int v,int w){ edge[tot].v=v;edge[tot].w=w,edge[tot].nxt=head[u]; head[...原创 2020-03-28 14:25:35 · 166 阅读 · 0 评论 -
HDU - 2196 Computer (树形DP,树的直径相关)
???? ???? ????题意:求与每个点距离最远的点的距离选择一个根,求出他向下和向上分别的最大值,两者再求一个最大值即可。这里的DP也可以用在求直径上(树中存在负权的时候dfs/bfs不再适用), 把最后一步换成dp0与dp2求和即可int n;int id[MX];//i结点的最深链在哪个儿子ll dp[MX][3];int head[MX],tot;struct IN{int v,w,...原创 2020-03-28 13:17:09 · 183 阅读 · 0 评论 -
CodeForces - 1097D Makoto and a Blackboard (积性函数,概率DP)
const ll mod=1e9+7;ll n,ans,dp[MX][66];int k;void extgcd(ll a,ll b,ll& d,ll& x,ll& y){ if(!b){ d=a; x=1; y=0;} else{ extgcd(b,a%b,d,y,x); y-=x*(a/b); }}ll inverse(ll a,ll n)...原创 2020-03-18 22:44:28 · 152 阅读 · 0 评论 -
CodeForces - 1096D Easy Problem (DP,前缀)
???? ???? ????以前面不含有har为例,遇到r,可以选择删或者不删,不删则前面不能含有ha,删的话就加上当前的a[ i ],还有就是根据这个递推关系,需要先一步判断完不含有h再判断ha,再判断har,//dp[1]前面不含有h//dp[2]前面不含有ha//dp[3]前面不含有har//dp[4]前面不含有hardchar s[MX];int n,a[MX];ll dp[MX][5];...原创 2020-03-17 22:33:40 · 183 阅读 · 0 评论 -
CodeForces - 1105C Ayoub and Lost Array(统计模个数,DP)
(1)关于求(l,r)中模3为0/1/2的个数,假设我们可以求出f(x)=【(1,x)模3为0/1/2的个数】,那么最后的答案即为f(r)- f( l - 1),求模为0,即求前面(1,2,0)的块数,求模为1即求前面(2,0,1) 的块数(这里我们在1前面补2,0)(2)然后就是显然分配方案存在递推关系const ll mod=1e9+7;ll dp[MX][3];inline voi...原创 2020-03-15 21:58:12 · 157 阅读 · 0 评论 -
CodeForces - 1107E Vasya and Binary String (区间DP,背包)
???? ???? ????(1)计算删长为n的某段的最大收益(背包)(2)就变成了这个题#define int llint a[222],cnt[222],val[222];int dp[222][222][222];//消除i到j及j后面k个与j颜色相同的块的最大收益void init(int n)//贪心计算连续删除一段的最大收益{ for(int i=1;i<=n;++i) ...原创 2020-03-14 18:18:06 · 191 阅读 · 0 评论 -
POJ - 1390 Blocks (区间DP,三维)
????♂️ ????♂️ ????♂️考虑dp[ l ][ r ]表示消除l到r的最大收益,但是这种表示无法表示中间不连续删除的情况,所以加上一维,表示 r 与 后面k个数字共同删除的最大收益int a[222],cnt[222];int dp[222][222][222];//消除i到j及j后面k个与j颜色相同的块的最大收益int dfs(int l,int r,int k){ i...原创 2020-03-14 17:07:28 · 164 阅读 · 0 评论 -
CodeForces - 1324F Maximum White Subtree(树形DP,换根法)
???? ???? ????树上每点的权值col[ i ]为1/-1,对于每点x,求:包括该点的连通子集的最大价值。假定 1 为根,设f[ i ] 为以 i 为根节点的子树的最大价值,设g[ i ]为包括 i 的连通集合的最大价值,与f[ i ] 相比,其实就是切不切掉u—v 这条边的区别。然后就能得到如下式子int col[MX],f[MX],g[MX];vector<int>mp[MX...原创 2020-03-13 12:04:39 · 188 阅读 · 0 评论 -
CodeForces - 1324E Sleeping Schedule (DP)
????♂️ ????♂️ ????♂️注意通过初始化控制非法状态转移,比如第一个睡觉的时间就只能是从dp[ 0 ][ 0 ]转移过来,不能是dp[0][ 1 ] 等,否则会出现多算int dp[5555][5555];void solve(){ int n,h,l,r;cin>>n>>h>>l>>r; rep(i,n+1) rep(j,...原创 2020-03-13 09:26:41 · 187 阅读 · 0 评论 -
CodeForces - 1114D Flood Fill (区间DP)
???? ???? ????遇见这种数据范围,这种区间染色的题,注意考虑区间DP,另外为了方便处理,先对数组进行压缩,保证相邻的元素不相等//dp[l][r][0]变成col[l]的最小步数//dp[l][r][1]变成col[r]的最小步数int a[MAXN],c[MAXN];int dp[5555][5555][2];void solve(){ int n;cin>>n; ...原创 2020-03-07 11:04:50 · 109 阅读 · 0 评论 -
CodeForces - 1133E K Balanced Teams (递推)
???? ???? ????记得见过几次分组的题,再看到还是不会往递推上面想,这次记一下吧。对于每个人,他到达的状态有两种,一种是不选这个人,另一种就是选了这个人以及之后能选的(pos[ i ]),然后可选的组数减一。搜的时候用一下记忆化。//不加入组//新开一组int n,k;int a[MAXN],pos[MAXN];int dp[5555][5555];int f(int i,int p){...原创 2020-02-22 19:53:38 · 156 阅读 · 0 评论 -
CodeForces - 1303E - Erase Subsequence(DP,字符串)
???? ???? ????分为两部分,先检查抽一次是否可以,再枚举第一次抽到哪,检查是否可行,昨天没想出来怎么搞第二部分,今天看了看是DP,,,dp[ i ] [ j ] 表示s该用第i个,并且t1该匹配到了第j个时,t2最多该匹配哪个,注意状态转移时要从合法状态转移(dp小于0时不操作)//1,检查用一次是否能够//2,枚举t分成两段的交点bool check (const string &...原创 2020-02-13 14:12:32 · 228 阅读 · 0 评论 -
2020牛客寒假算法基础集训营2 H - 施魔法 (递推)
???? ???? ????这场好多公式化简哦,根据递推公式维护一个minv即可#define int llint v[MAXN],dp[MAXN];signed main(){ int n,k;cin>>n>>k; rpp(i,n) cin>>v[i]; sort(v+1,v+n+1); if(n<k+k) { ...原创 2020-02-08 14:47:26 · 128 阅读 · 0 评论 -
2020牛客寒假算法基础集训营2 C - 算概率 (DP)
???? ???? ????是个DP套路题,以前也见过类似的明明,一开始写不出我好菜#define int llconst int mod=1e9+7;int p[2010],f[2010],dp[2010][2010];signed main(){ int n;cin>>n; rpp(i,n) { cin>>p[i]; f...原创 2020-02-08 12:37:35 · 166 阅读 · 0 评论 -
2020牛客寒假算法基础集训营1 I - nico和niconiconi (DP)
是个很好想的DP,QAQ,如果自己能往DP那方面想想的话#define int llint dp[MAXN];char s[MAXN];signed main(){ int n,a,b,c;cin>>n>>a>>b>>c; scanf("%s",s+1); for(int i = 4;i<=n;++i) ...原创 2020-02-07 15:57:39 · 113 阅读 · 0 评论 -
Codeforces Round #564 (Div. 2) D - Nauuo and Circle(树上排列)
???? ???? ????//结论:某节点为根的子树肯定在圆圈上连续的一段#define mod 998244353signed main(){ fast; int n; while(cin>>n) { vector<int>du(n+1,0); ll ans=n%mod; rpp(i,n-1) { int x,y;cin>>x>...原创 2020-01-23 19:47:34 · 146 阅读 · 0 评论 -
Codeforces Round #568 (Div. 2) G1 - Playlist for Polycarp (easy version) (状压DP)
???? ???? ????//总共T时间,相邻歌曲类型不相同,有多少种组合方式,n < 15// dp[k][i],k某状态,i最后结尾为i格式const int mod = 1e9 + 7;int t[22],g[22],dp[MAXN][4];signed main(){ int n,T;cin>>n>>T; rep(i,n) cin>>t...原创 2020-01-22 21:42:55 · 139 阅读 · 0 评论 -
Educational Codeforces Round 80 (Rated for Div. 2) C - Two Arrays(DP)
????♀️ ????♀️ ????♀️题意:从1~n里面选出来m个数字组成a数组,再选出来m个组成b数组,要求a非递减,b非递增,且bi>=ai题目挺有意思(短)的,解题过程分两步:1,说是选两个数组其实就是选出来一个长m*2的非递减数组2,假设要从n的全排列中选出来m长的非递减数组,因为元素是可重复的,最多重复m次,其实就是相当于从下面这个矩阵中选择元素从这个矩阵中选择元素,每行只能选择一...原创 2020-01-15 11:09:24 · 204 阅读 · 0 评论 -
AcWing 275. 传纸条 (线性DP)
✉ ✉ ✉//dp[k,x1,x2]表示总共走了k步,第一条路线在x1行,第二条路线在x2行 max//dp[k,x1,x2]--->//dp[k-1,x,y],dp[k-1,x-1,y],dp[k-1,x,y-1],dp[k-1,x-1,y-1]//1<=x1<=n;------>x1>=1 , x1<=n//1<=k-x1<=m --...原创 2020-01-12 21:24:27 · 134 阅读 · 0 评论 -
AcWing 274. 移动服务
???? ???? ????//考虑快递员数量这个特殊的数据范围//考虑暴搜//考虑坐标范围这个特殊的数据范围//dp[i,x,y] 处理到第i个,其他两个快递员在x,y位置的最短时间//dp[i,x,y] ---> //dp[i+1,x,y] = dp[i,x,y] + c[p[i]][p[i+1]]//dp[i+1,p[i],y] = dp[i,x,y] + c[x][p[i+1]]//d...原创 2020-01-11 23:05:14 · 180 阅读 · 0 评论 -
AcWing 273. 分级 (推论,DP)
???? ???? ????//重点:一定存在一组最优解,使得每个 Bi都是原序列中的某个值。//即 bi是由ai中的元素组成的,但不一定是ai的排列//dp[i,j] 为dp[i,j]为a[1~i]安排好,最后一个数字是a'[j] 的差的最小值//dp[i,j] = min{dp[i-1][k](k<j)} +a'[j]-a[i]const int N=2222;int n,ans,a[N],b[...原创 2020-01-11 22:10:31 · 187 阅读 · 0 评论 -
Acwing 272. 最长公共上升子序列 (动态规划)
???? ???? ????//dp[i][j]表示a到第i位置,b到第j位置并且最后一个元素是bj的最长序列长度//如果这个序列不包括ai(ai!=bj) //dp[i,j] = dp [i-1.j]//否则(ai=bj)//dp[i,j] = max dp [i-1,k](b[k]<b[i],k<j)vi a,b;int dp[3333][3333];signed main(){...原创 2020-01-11 20:26:39 · 175 阅读 · 0 评论 -
Codeforces Round #594 (Div. 2) C - Ivan the Fool and the Probability Theory (DP)
???? ???? ????题意:每次相连最多只有两个同种颜色的方块相接,有多少种列法过的人好多,,大家DP都这么强吗QAQ详细推导1,第一行只要有两个颜色相同,整张图即可确定2,若第一行全是黑白交替,那么接下来每一行也必须是黑白交替,不过每一行下面有时有两种情况(这个推导怎么似曾相识,应该意识到这时候就和一行里面的分析是一样的),所以这时候就要转去看列,横着的黑白用黑代替,白黑用白代替,第一列确定也可确...原创 2019-12-30 23:25:35 · 121 阅读 · 0 评论 -
CF 148 D - Bag of mice(概率DP)
???? ???? ????dp[ i ] [ j ],i只白鼠,j只黑鼠获胜的概率边界条件:dp[ i ] [ 0 ]=1,dp[ 0 ] [ j ]=0题意给出的四种情况(转移方程):先手拿到白鼠i/(i+j)先手拿到黑鼠,后手拿到白鼠j/(i+j) * i/(i+j-1)先手拿到黑鼠,后手拿到黑鼠,跑掉一只黑鼠 j/(i+j) * (j-1)/(i+j-1) * (j-2)/(i+j-2) * d...原创 2019-12-28 10:37:25 · 119 阅读 · 0 评论 -
Codeforces Round #610 (Div. 2) B2 - K for the Price of One(DP)
???? ???? ????题意:每次可以买一个,或者买k个只花最高的那份的价钱,问你用 p 块钱最多买几件。1,为了尽可能多买肯定从价钱小的开始买2,题目其实给出了两种状态转移方式,排完序后,要到达第 i 件,可以从i-1转移,也可以从 i - k 转移int main(){ int t, n, p, k;cin >> t; while (t--) { cin>>n&g...原创 2019-12-25 09:01:48 · 85 阅读 · 0 评论 -
D. Choosing Capital for Treeland(两种树形DP)
???? ???? ????题意:给你一个树,边为有向边,选择某一点为根节点,要使该点能够到达所有点,问你最小花费为多少。把两种树形DP(自下而上or自下而上)完美结合的好题 然而我不会首先假设我们已经知道1点是根节点,要计算该点为根的最小翻转次数;那么就另原图中的边权值为0,反向边权值为1.另dp[ i ]为该点为根节点之后其子树 全部可达需要的翻转次数,这时候就应该从叶子结点开始转移:if 是叶...原创 2019-12-12 15:54:18 · 266 阅读 · 0 评论