![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
动态规划
文章平均质量分 93
KXL5180
这个作者很懒,什么都没留下…
展开
-
每日一题 CF1029E-Tree with Small Distances
CF1029E-Tree with Small Distances牛客链接CF链接很好找,就不贴了题意:给你一颗树,要求你加入最少的边,使得1节点到任意节点的距离不超过2数据范围,点数 20万注意,这道题可能需要效率比较高的输入和树的遍历方式做法:我也好久没写过题了,虽然之前写过但不过都没有记录,现在还是记录一下,为了找工作做准备。我拿到这道题,我一脸懵逼,WC怎么这么难,想了想不可能是贪心,因为我觉得贪心越复杂肯定是错误的,但不过贪心能不能做,我不知道,好像能做吧。于是我就想到了原创 2021-12-01 17:07:09 · 254 阅读 · 0 评论 -
HDU6796 X Number(数位DP)杭电多校
题意:定义对于一个数字,那一个位数的数字出现最多,就定义为那个数字。比如133344就是状态3,111122就是状态1,对于出现次数不唯一的,定义为状态10.现在给一个区间问(l,r)(l,r)(l,r)中有多少状态为ddd的数,ddd不为10.做法:看一眼数位dp,然后状态怎么记录,考虑记录0-9每一个数字出现的次数,可以使用字符串,vectorvectorvector等使用mapmapmap标记,可以赌一下状态不会很多,甚至使用哈希,但不过这道题显然不会让你这么做,那么就需要优化。首先对于记录状态.原创 2020-07-29 20:47:56 · 650 阅读 · 0 评论 -
虚树——P2495 [SDOI2011]消耗战
好久没有学习新的知识了。https://www.luogu.com.cn/problem/P2495今天我学习了一下虚树。虚树就是一个不存在的树。用来简化问题。它只包括一些关键点和他的LCA我们来看看上面这一道题题意给出一棵树,含有边权。每次询问给出k个点,然后询问每个点与根断开的最小代价。做法因为数据的关系肯定没法直接dp过去的。首先我们可以发现可以与根到其他点的路径没有关系...原创 2020-03-18 22:14:22 · 152 阅读 · 0 评论 -
小明打联盟 背包问题
https://ac.nowcoder.com/acm/problem/14553题意都是中文的,就不用多说了;做法:首先一看就能知道是,完全背包问题,但不过他在L到R的技能,但不过,按照普通的思维,肯定是转化为L到R这么多个背包去完全背包,在数据小的时候可以这样做,但不过这道题数据有点大,显然是不可能的。仔细一想对于L到R他有一个蓄力值的加成A和一个基础伤害temp,我们做一个价值分析,...原创 2019-04-29 20:09:07 · 491 阅读 · 0 评论 -
牛客 xinjun与阴阳师(背包问题)
https://ac.nowcoder.com/acm/problem/14602题意都是中文的,没啥好说的。做法:显然是01背包问题,但不过由于是n种方案,每一种方案中只能选一个,加上数据量不是很大,直接三重循环,是可以接受的。#include<bits/stdc++.h>using namespace std;typedef long long ll;const...原创 2019-04-29 21:06:00 · 282 阅读 · 0 评论 -
Codefroces B. Three Religions
https://codeforces.com/contest/1150/problem/D题意:就是先给一个单词,然后给你三个空串,然后给你一些操作,分别是在单词中取出字母加上一些字母,或者减去一些字母,问三个串有没有冲突的。用过了的字母,在没有别的串减去时是不可以用的。而且一个串的字母的取法是按照他给的操作的顺序的,比如第一次加了a第二次加了c在单词中a的前面的c不能取,只能取a后面的;...原创 2019-04-30 21:36:14 · 236 阅读 · 0 评论 -
牛客删括号 动态规划
https://ac.nowcoder.com/acm/problem/21303题意中文的不说了;做法,想到动态规划应该不难的,dp的表示dp[i][j][k]表示A串扫描了前i个和B串扫描了前j个匹配的情况下,A串删除了的‘(’个数与‘)’的差值;最终答案就是 dp[lena][lenb][0];if (a[i] == b[j]) dp[i][j][k] |= dp[i -...原创 2019-05-09 19:16:31 · 355 阅读 · 0 评论 -
P5228 [AHOI2013]找硬币
https://www.luogu.org/problemnew/show/P5228https://ac.nowcoder.com/acm/problem/19895题意中文的,就不多说了,就是选择一种合适的硬币序列,买几个东西,每个东西不是找零,用的硬币最少;做法:根据贪心的思想,加上是成倍数的递增,肯定先用大的面值,数量最少。用dp[i]表示,最大面值为i时的最少数量,我们从小的...原创 2019-05-09 20:22:00 · 271 阅读 · 0 评论 -
牛客 饱和式救援 西北大学集训队选拔赛 概率dp
https://ac.nowcoder.com/acm/contest/892/B题意:不说了,中文题面说的很清楚做法:首先题目给了n个救援队,然后一个发动机,可以由多个救援队,救援,因此,直接算出每一个发动机不能修复的概率就可以得到修复的概率了。dp[i][j]表示,表示i个发动机,修复好了j个转移方程:dp[i][j]=dp[i-1][j-1]*a[i]+dp[i-1][j]*...原创 2019-05-12 19:06:25 · 234 阅读 · 0 评论 -
洛谷 P1725 琪露诺 单调栈优化dp
https://www.luogu.org/problemnew/show/P1725题意中文的不说了;做法:首先可以想到一个dp方程 dp[i]表示当前位置i的最大值,dp[i]=max(dp[j])+a[i] j表示可以跳到i的位置,但不过暴力肯定T了但不过仔细一想,能到i的位置的区间长度是固定的,所以直接用单调栈维护,在i前面的(i-l,i-r)的区间就可以了,注意,长度不足的情...原创 2019-05-23 15:18:48 · 343 阅读 · 2 评论 -
POJ1015 Jury Compromise (动态规划 难)
http://poj.org/problem?id=1015题意:给出n个人,每个人有两个值di和pi要求你从选出m个人是的总的D和P的差距最小,如果差距相同则输出D+P较大的,同时输出选择的m个人,按照升序排列。做法:刚刚开始想了一个暴力的做法,就是dp[i][j][d][p]就是前i个人选j个人两种值的总和分别为d和p的时候的是否可行,吧第一维滚动掉。然后按着背包写了写,嗯发现找了一些...原创 2019-06-04 13:50:59 · 201 阅读 · 0 评论 -
Codeforces contest 1185 G1. Playlist for Polycarp (easy version)
https://codeforces.com/contest/1185/problem/G1G2做不来;题意:给你一个时间T和n首歌,每一首歌都有它的时间和类型,要求每一首歌只能安排一次,并且同类型不能安排在一起,问吧时间T放满一共有多少种方法。做法:由于范围比较小可以直接用一个状态压缩来表示状态,设dp[i][j][k]表示i时间状态j结尾是k类型的歌的种类,其中j是一个压缩状态,于...原创 2019-06-21 14:44:56 · 380 阅读 · 0 评论 -
Codeforces D. 0-1-Tree (树形dp)
https://codeforces.com/contest/1156/problem/D题意:给你一颗树,同时给每一条边定义一个属性0和1,定义(x,y)表示x到y,其中我们经过1边后不能经过0边,求有多少对(x,y);做法:本蒟蒻只想得到树形dp的想法,想不到大佬的并查集方法。dp[u][4],分别定义了u和他子树的四种状态。如下图dp[u][0]表示u的子树中全部是0连在一起的个...原创 2019-05-02 21:23:52 · 1117 阅读 · 0 评论 -
Chino with Triangle ( 西工大程序设计创新实践基地春季选拔赛)树形dp
https://ac.nowcoder.com/acm/contest/553/E题意,是中文,没有什么读不懂的。做法,肯定是树形dp,如果想到,正难则反,一条链上的不可以组成三角形,这道题就不难了。首先遍历每一个结点,然后把他所有子树的结点加起来,依次相乘新加入子树的结点数,然后最求结点上面的组合,其实不难的,是可以做的#include<iostream>#inc...原创 2019-04-18 19:46:31 · 183 阅读 · 0 评论 -
HDU 2476 String painter(区间dp)
这道题就不怎么想得到了题意:给一个A串B串,每次只能将一段连续区间内的字母改成另外的同一个字母,问A变成B的最少操作次数。做法:先假设AB都不想等,g[i][j]表示i~j这个区间最少的操作.首先最基础的递推g[i][j]=g[i+1][j]+1;表示需要在上一个递推的区间上,操作一次。然后枚举短点,if(b[i]==b[k]) g[i][j]=min(g[i][j],g[i+1]...原创 2019-04-08 16:57:09 · 139 阅读 · 0 评论 -
HDU 4745 Two Rabbits(区间dp)
这道题相对来说,我觉得就有点考查读题了读题时一定要细心,大致就是要你求一个回文子序列,递推方程很简单if(a[i]==a[j])g[i][j]=max(g[i][j],g[i+1][j-1]+2);elseg[i][j]=max(g[i+1][j],g[i][j-1]);但不过他是环形的,但不过他又说了两只兔子可以同时站在一个石头上。所以遍历答案是就有同时遍历,长度为n...原创 2019-04-08 16:46:00 · 124 阅读 · 0 评论 -
HDU 4632 Palindrome subsequence(区间dp)
题意:给一个字符串,求回文子序列个数,最后答案模10007区间dp简单题区间dp一般第一层枚举区间长度,第二层就是枚举区间了,第三层可能还有什么枚举短点,一般是n^3的复杂度,如果满足一定的条件可以用四边形不等式优化。这道题就二层循环就可以了。区间的遍历顺序,也有很多种写法,但不过写的前提就是,要确定递推中以前的状态都是存在的dp[j][i]=dp[j+1][i]+dp[j][...原创 2019-04-08 16:35:12 · 109 阅读 · 0 评论 -
HDU 3506(区间dp) 四边形不等式优化
合并石子差不多,题意一样的。先来一道弱化版https://www.luogu.org/problemnew/show/P1880在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。试设计出1个算法,计算出将N堆石子合并成1堆的最小得分和最大得分.本题题意和上面一样的这次变成了猴子聚...原创 2019-03-30 16:23:58 · 249 阅读 · 0 评论 -
HDU 2196 Computer (树的直径)
给出一棵树,求离每个节点最远的点的距离首先,树的直径有一个性质,就是树上的点到树的直径的两个端点中有一个一定是距离那个点最远的;这样这道题就秒了。同时这道题也是经典的树形dp题 后来补上吧//#include<bits/stdc++.h>#include<iostream>#include<algorithm>#include<st...原创 2019-03-29 16:25:33 · 163 阅读 · 0 评论 -
poj3659 Cell Phone Network(树形dp)
树的最小支配集;给一颗树,每个节点可以覆盖和他相连的所有节点,问用最少的点把所有的点覆盖完。比poj 1463难,关键是思考要全面dp[u][0]表示u的子树及以下的结点全部被覆盖,但u被自己覆盖;dp[u][2]表示u的子树及以下的结点全部被覆盖,但u被自己的父亲结点覆盖。dp[u][1]表示u的子树及以下的结点全部被覆盖,但u被自己的儿子结点覆盖。dp[u][0]+=m...原创 2019-03-29 16:19:15 · 181 阅读 · 0 评论 -
zoj 3201 Tree of Tree(树形dp)
给一棵节点带权的树,找到一个有k个节点的子树,求这个子树的最大权值,这个子树不一定吧全部结点取完,但不过一定是相连的也可能是我接触的子树的概念不对吧、、、?dp[u][j]=max(dp[u][j],dp[u][j-l]+dp[v][l]);这个转移方程就是背包只不过是树上背包,但不过注意l的取值,因为为子树所以,当前结点一定要取到,l应该小于j///#include<bi...原创 2019-03-29 15:59:08 · 163 阅读 · 0 评论 -
poj2378 Tree Cutting (树形dp)
简单树形dp给定一棵无向树,节点为n(n<=10000),问删除那些节点可以使得新图中的每一个连通分支的节点数都不超过n/2首先 有dp维护以u为结点的下面的所以子树结点的个数在每一个结点,同时找到他子节点的子树的结点数最大值然后稍微判断一下就可以了;///#include<bits/stdc++.h>#include<stdio.h>#in...原创 2019-03-29 13:34:49 · 163 阅读 · 0 评论 -
poj1463 Strategic game(树形dp)
简单树形dp树的最小点覆盖dp[u][0]+=dp[v][1]; u-v 如果u不覆盖则v一定覆盖dp[u][1]+=min(dp[v][0],dp[v][1]);u-v 如果u覆盖则v可以覆盖或者不覆盖#include<algorithm>#include<stdio.h>#include<string.h>#include<ve...原创 2019-03-29 13:29:59 · 254 阅读 · 0 评论 -
poj2342Anniversary party(树形dp)
树形dp入门题;树形dp一般就是确定dp的维数,然后一个dfs就完了,相当于树上递推,从底层递推到上一层dp[u][0]+=max(dp[v][1],dp[v][0]); 上司u不来,下司v可以来可以不来dp[u][1]+=dp[v][0];上司u来#include<algorithm>#include<stdio.h>#include<stri...原创 2019-03-29 13:24:17 · 108 阅读 · 0 评论 -
HDU 2296 Ring AC自动机加上字符串dp
http://acm.hdu.edu.cn/showproblem.php?pid=2296题意:构造一个长度为n的字符串,价值最大。看见网上的大佬都说很简单,但不过我还是错了24次,最后看了博客还是不知道,然后一部分的按着博客的改,最后还是错了,隔了很久发现AC自动机写错了,最后改了也不对,第二天重新写了几发就对了。做法,利用AC自动机可以记录字符串匹配的状态的一个路径的思想,构建一...原创 2019-03-11 20:23:44 · 184 阅读 · 0 评论 -
HDU 4283 You Are the One(又是一道区间dp)
题意:给定每个diaosi的不开心值D,如果他第x个上场,他会有(x-1)*D的不开心值,因为他等了x-1个人,有一个小黑屋类似于栈,可以使用它来改变顺序,求最少的不开心值。做法:首先dp[i][j]还是表示i到j区间的最优值,然后还是三层循环,最主要的就是短点了。首先预处理所有人的等待时间的前缀和sum[i]。短点k表示区间i到j中i是第k个出去的g[i][j]=min(g[i][j...原创 2019-04-08 17:07:52 · 106 阅读 · 0 评论