动态规划
给我一瓶AC钙
是一颗萌菜没错了
展开
-
(POJ) 2181 Jumping Cows
传送门这个题有两种解法。第一种贪心:总是只选择最低点和最高点。这样对答案的贡献肯定是最大的。#include<iostream>#include<algorithm>using namespace std;const int maxn=150000+5;int p;int t[maxn];int main() { while(cin>>...原创 2018-12-10 14:29:14 · 291 阅读 · 1 评论 -
(CodeForces) B. Bear and Blocks (dp)
传送门题目大意:一列上有若干个方块堆,每堆方块有一个高度每次可以消去这堆方块最外面的那层,问要几次才能消去。解题思路:一看题意和图一开始有点手足无措,不过我们考虑到对于每一堆(列)想将他拿光,有三种情况,1,左边的拿光了,才能一次性将他拿完,2右边的拿光了,才能一次性将其拿光,3,一个一个的将其拿光(这种也只可能比左右的都矮的才可能优),所有可以只考虑左边的dp一次,只考虑右边的dp一次...原创 2019-04-12 10:36:13 · 258 阅读 · 0 评论 -
(CodeForces) D. Kefa and Dishes (状压dp)
传送门题目大意:有n个菜,每个菜只能吃一次,最多吃m个,每盘菜都有一个快乐值,吃菜的先后顺序也会增加快乐值。解题思路:一开始尝试用最小费用最大流,最后建了一个很复杂的图,发现并不是很好建出来,遂放弃,后来看了别人的写法状压dp,太菜了啊。dp[i][j],i二进制代表现在吃的菜的状态,1代表吃了,0代表没吃,j代表最后吃的j,这样达到的最高快乐值。由当前的dp[s][j],可以去更新后...原创 2019-04-12 10:49:34 · 305 阅读 · 0 评论 -
(HDU) 1565 方格取数(1) (状压dp)
传送门解题思路:dp[i][j]代表到第i行的第j个状态所能得到的最大的和,可以先处理一行没有两个相邻的满足条件的状态。然后把每行每个状态的和都算出来,状态转移的条件是当前这行第j个状态与上一行的第k个状态想与为0,即没有相邻的,那就能更新dp[i][j]:dp[i][j]=max(dp[i][j],dp[i-1][k]+sum[i][j]);还有一个就是n为20的最大情况数,不能直接1<...原创 2019-04-12 14:55:38 · 197 阅读 · 0 评论 -
(Luogu) P1430 序列取数 (区间dp)
传送门题意:给定一个长为n的整数序列(n<=1000),由A和B轮流取数(A先取)。每个人可从序列的左端或右端取若干个数(至少一个),但不能两端都取。所有数都被取走后,两人分别统计所取数的和作为各自的得分。假设A和B都足够聪明,都使自己得分尽量高,求A的最终得分。思路:看视频讲的这道题,喵啊,按照他的思路写了出来。取数肯定是取一段连续的序列,剩下一段连续的序列。首先定义F[l][...原创 2019-05-19 21:58:48 · 240 阅读 · 0 评论 -
(CodeForces)D - Programming Team Gym - 101002D (树型依赖背包)
题目biu树型依赖背包:传送门题意:n个员工,要选k个员工,每个员工都有一个薪水和能力,要使得最终性价比最高。由于这题要选上子节点就必须把父节点选上,我们很容易就想到了树型依赖背包。a[i]:代表能力,b[i]代表薪水我们可以通过枚举一个答案mid,可以判断 ,来进行check。我们将公式进行简单变换就是这样,我们可以将(a[i]-mid*b[i])看成第i件物品的价值,而i件物...原创 2019-07-24 16:26:54 · 264 阅读 · 0 评论 -
(Nowcoder) E.independent set 1
传送门题意:求集合所有子集的(最大独立集的个数)之和。解:先预处理与i点不相连的点集合a[i],然后直接二进制枚举每种子集,dp更新方程就是:dp[i]=max(dp[i^(1<<it)],(char)(dp[i&a[it]]+1)); 就是从该集合随便取出一个1,从要该点和不要该点中选择max。我一开始的写法是考虑改集合的每一个1,都进行一次更新,这样无疑是T...原创 2019-08-05 10:37:46 · 279 阅读 · 0 评论 -
(Nowcoder) G subsequence 1
传送门题意:就是为s中有多少子序列大于t代表的数字。思路:这是组合数+dp,组合数部分好想,当长度大于t切第一个不是0即可,dp部分如何解决,定义dp[i][j]:s长度为j的后缀有多少长为i的子序列大于t长度为i的后缀 个数。首先肯定是 dp[i][j]+=dp[i][j-1]如果 s[n-j+1]>t[m-i+1],即s长为j的后缀的第一个字符 大于 t长为i的后缀的第...原创 2019-08-02 13:18:10 · 260 阅读 · 0 评论 -
(Nowcoder) A.All-one Matrices (最大子矩阵+哈希)
传送门题意:求不同的最大子矩阵的个数。解:求最大子矩阵,不管先把模板先套了吧,悬线法。主要问题就是在于去重了。悬线法可以记录(i,j)的左边界,右边界,高和现在的底,那就好办了,那我们就全记录了,左右上下,用l+r来当key,但是用unordered_map还是会t的,故直接哈希lr即可。如果当前lr没有那ans++,如果当前下坐标比记录的下坐标更大,那就直接替换,最后如果上坐标改变,an...原创 2019-08-10 21:02:09 · 185 阅读 · 0 评论 -
(Nowcoder) J.Just Jump (动态规划+组合数+容斥)
传送门题意:L长的数轴,从0开始跳,每次可以跳>=d的距离,但是有m限制,就是ti时刻不得跳到pi处,求到L的方案数解:先不考虑m限制,dp很容易推出了,前缀和优化就是O(n)的。然后考虑限制减去,就是求出经过一次pi(限制处)再抵达L的方案数,这里我们很容易想到容斥定理,用容斥来求。官解:解释一下这个组合数,就是先pi先减去d*ti的最低限制,剩下的就是多余的部分,但是ti...原创 2019-08-11 15:48:44 · 211 阅读 · 0 评论 -
(2019南京网络赛) D. Robots (概率dp)
传送门题意:给出一张N个点M条边的有向无环图,1号点为全图唯一的入度为0的点,N号点为全图唯一的出度为0的点现在你从1号点出发,每单位时间,你有相同的概率 走向相邻节点或原地不动。第 i 单位时间内你的消耗为 i ,询问你走到 N 点的期望消耗。解:用两次期望递推,第一次dp1[i]求i点到N点的期望时间,第二次dp2[i]求i到N的期望代价,图是个拓扑图,所以我们可以从后往前推。...原创 2019-09-01 22:45:46 · 677 阅读 · 6 评论 -
(2019南昌网络赛) C. Hello 2019 (矩阵建模+线段树维护)
传送门这是一道CF原题,思路在这线段树维护的时候,只要从右到左维护,不就变成了只能有2019不能有2018了吗,(关键是我也不会正着考虑呀T T#include<bits/stdc++.h>#define il inline#define pb push_back#define ms(_data,v) memset(_data,v,sizeof(_data))#...原创 2019-09-09 20:34:28 · 459 阅读 · 0 评论 -
(2019上海网络赛) F. Rhyme scheme (dp)
传送门题意:求满足题意的第K大字典序,(题意中AAB和AAC是相同的,所以就不会有AAC解:自己动手画一下的话,就会有下面这个图(就直接拿题解上的了),可以发现某个节点下面可以接的儿子范围是到该节点路径上最大的的字母+1,比如图最下一层的第三个字母A,考虑它可以接的接的儿子就是A,B,C。如果我们可以知道当在某个节点时它各个儿子可以代表的不同字典序的数量,那这个问题就可以求解了。...原创 2019-09-16 16:47:07 · 878 阅读 · 0 评论 -
(2019杭电多校3) Distribution of books (dp+离散化+线段树)
传送门题意:n个数,可以选择前m(m自定)个数分成k块,问每块的数字和的最大值最小是多少解:首先我们可以二分这个最小的最大值mid,然后去check,我们可以定义dp[i],前i本书在满足<=mid的情况下最多可以分成几块,那么当sum[i]<=mid的情况下,dp[i]=1,反之0;更新的话dp[i]=max(dp[i],dp[i]+1) (当sum[i]-sum[j]<...原创 2019-09-17 15:44:24 · 285 阅读 · 0 评论 -
背包九讲 11题
聚聚视频讲的太好了前六讲最后三讲题目全在这了01背包问题#include<bits/stdc++.h>#define il inline#define pb push_back#define ms(_data,v) memset(_data,v,sizeof(_data))#define SZ(a) int((a).size())using nam...原创 2019-09-21 20:43:07 · 172 阅读 · 0 评论 -
(Luogu) P2495 [SDOI2011]消耗战 (虚树+动态规划)
虚树入门题目传送门虚树的主要思想就是对于一棵树,仅仅保留有用的点,重新构建一棵树。#include<bits/stdc++.h>#define il inline#define pb push_back#define ms(_data,v) memset(_data,v,sizeof(_data))#define SZ(a) int((a).size())usi...原创 2019-10-02 10:07:41 · 179 阅读 · 0 评论 -
(Luogu) P1879 [USACO06NOV]玉米田Corn Fields (状压dp)
传送门位运算要掌握好#include<bits/stdc++.h>#define il inline#define pb push_back#define ms(_data,v) memset(_data,v,sizeof(_data))#define SZ(a) int((a).size())using namespace std;typedef long lo...原创 2019-10-02 11:01:07 · 223 阅读 · 0 评论 -
(CodeForces) F. Clique in the Divisibility Graph (dp)
传送门题目大意:给出一个数组序列,要求最长的成倍增长(倍数不需要相同)的序列。解题思路:首先这肯定是个dp,首先我们可以将整个序列先排序,如果我们考虑a[i],那他可以从他的因子转移过来,但是这样每个都要算个因子,成本太大,我们不如从当前这个a[i]往后推,倍数的增长,知道超过序列的最大值,这样就是一个log的复杂度了,num[j]代表以j结尾的满足题意的最长长度。#include&...原创 2019-04-12 10:15:16 · 234 阅读 · 0 评论 -
2015蓝桥杯 垒骰子 (动态规划+矩阵快速幂)
解题思路:动态转移方程,先考虑底面应该是挺好想的,放第n个骰子,可以由n-1个骰子推出,为了方便将他的冲突面,改成都是朝向的那个面,比如1 2 冲突,那对应的两个骰子的底面是1,5;第n个骰子底面是1,可能第n-1骰子底面是1~6,这样的话,就可能有36种转移,当然最后要乘以4*n,因为我们只考虑了底面,但是题目的n有1e9,我们不能直接for循环。这里需要矩阵快速幂,An=An-1*X X...原创 2019-03-23 14:35:36 · 528 阅读 · 0 评论 -
(POJ) 2385 Apple Catching
传送门题目大意:有两棵苹果树,每秒都会有一颗苹果树掉苹果下来,人一开始在第一颗树下,只有w次移动的机会,求最多能拿几颗苹果。解题思路:dp[i][j]代表在第i课树下移动了j次获得的最多果子,由于一开始在第一颗树下,所以初始化要注意一下。#include<iostream>#include<cstring>#include<algorithm>...原创 2018-12-10 14:48:07 · 187 阅读 · 0 评论 -
(POJ) 2378 Tree Cutting
传送门题目大意:给定一棵无向树,节点数为n(n<=10000),问删除那些节点可以使得新图中的每一个连通分支的节点数都不超过n/2解题思路:这是一道入门的很裸的树型dp。dp[i]代表删除i节点后,分成的各个部分中 节点数量最大值。#include<iostream>#include<cstdio>#include<vector>usi...原创 2018-12-10 14:54:59 · 177 阅读 · 0 评论 -
(POJ) 1159 Palindrome
传送门题目大意:给你一串字符串,问最少添加几个字符可以使该字符串变成回文串。解题思路:先求出该字符串的最长回文子串。然后总长度减去最长回文子串的长度就行了。已经形成回文的我们没有必要多此一举去添加字符了,而还单着的,我们在相对的位置在给他加一个就行了。但是直接区间dp求最长回文字串,开二维数组会MLE,而又不太好滚动(不知道可不可以滚动),不过可以直接开short 莽过。#inc...原创 2018-12-10 15:06:39 · 212 阅读 · 0 评论 -
(POJ) 1050 To the Max
传送门题目大意:给你一个矩阵,求里面的最大子矩阵(求和最大)。解题思路:第一想法当然是暴力枚举了,当然立即pass,复杂度过高,那再用前缀和处理一下的,这样复杂还是过高的。直接枚举是肯定不现实的。那我们直接枚举上界呢,然后将它下面的一层一层的加上去,每加一次都算一次最大子序列和。比如枚举第i层作为上界,求出此时的最大子序列和就是以i为上界,宽为1的最大子矩阵;在将i+1层的数依此加上第i层...原创 2018-12-10 15:36:08 · 203 阅读 · 0 评论 -
(Luogu) P1736 创意吃鱼法
传送门解题思路:对角线可以是从左上角到右下角,也可以是从右上角到左下角,所以答案需要求两次,去最大的。先讨论从左上角到右下角。dp[i][j]为以(i,j)点为右端点的能吃到的最多的鱼,由于需要子矩阵的其他地方没有鱼,所以需要两个辅助数组,分别统计(i,j)这点向上有多少个连续的0,向左有多少个连续的0。所以我们可以得到 dp[i][j]=min(dp[i−1][j−1], up[i−1][j...原创 2019-01-13 15:37:55 · 138 阅读 · 0 评论 -
(Luogu) P2258 子矩阵 (搜索+动态规划)
视频讲解戳这里 (bj聚聚讲的可好了)传送门解题思路:这题一看和最大子矩阵很类似。但是要比那题更加的复杂,考虑时有诸多细节。思路就是先把行确定下来,这里用一个搜索,然后再去考虑列,考虑列的时候,我们需要预处理我们所选行 的竖直的分值(即题目定义的相邻元素差的绝对值)和横置的分值。需要两个数组,横置 line[i][j]代表 第i列和第j列横向的之差的绝对值之和;竖直col[i],代表第i列...原创 2019-01-18 21:57:47 · 257 阅读 · 0 评论 -
(CodeForces) C.Ayoub and Lost Array (线性dp)
视频讲解戳这里传送门题目大意:一个数组的大小为n,每个元素的的取值范围是[l,r];然后数组中所有数的和能被3整除,求这样数组的个数,结果mod 1e9+7.解题思路:这题一看有两种想法,一是线性dp,二是组合数,最后还是用线性dp解决了这道题,dp的思路也挺简单的dp[i][j]代表数组里有i个数,和模3为j的个数,我们可以事先将[l,r]区间中mod3为0,1,2的数算出来,代码如...原创 2019-01-21 11:30:12 · 274 阅读 · 1 评论 -
(Luogu) P1439 【模板】最长公共子序列
传送门这题怎么能叫模板呢,分明是个变种题解题思路:dp呀,这不是肯定dp嘛,dp[i][j]指的是a串到第i个字符,b串到第j个字符的最长公共子序列,看一眼数据,还要把二维优化成一维。代码如下#include<iostream>#include<algorithm>#include<string>#include<cstring>...原创 2019-01-21 14:44:45 · 258 阅读 · 0 评论 -
(Nowcoder) E 诡异数字(数位dp)
牛客小白月赛8真的打的自闭了,感觉一点都不小白 T_T (肯定是我太菜了,没错就是这样的)题目链接https://www.nowcoder.com/acm/contest/214/E题解说这是一个非常简单的数位dp,没接触过,感觉挺难的(大概这就是菜吧)先稍微了解了一下数位dp,附上写的非常好的数位dp详解https://blog.csdn.net/wust_zzwh/article/...原创 2018-10-21 21:07:46 · 321 阅读 · 0 评论 -
HDU 6148 Valley Numer
写了多天一直被打断的数位dp,终于写完了(丧)#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxn=105;const ll mod=1000000007;ll f[maxn][15][5],T;ll lim[maxn];//f[i][j][k] 代表i位前驱位...原创 2018-10-29 15:59:50 · 141 阅读 · 0 评论 -
(Luogu) P1052 过河 (状压dp)
传送门解题思路:这题的状态转移方程还是很好想的,dp[i]代表跳到第i点踩到的最少石头,dp[i]=dp[i-j]+stone[i],j位距离,即跳j个距离到i点,stone[i]表示这里是否有石子。但是这里l非常大,只是循环也会超时,所以需要状态压缩。这里压缩的方法有90缩,72缩(戳我)还有2520缩,这里我写的是2520缩,这个很好理解,2520是1~10的最小公倍数,就是从i点出发,...原创 2019-01-16 16:47:24 · 183 阅读 · 0 评论 -
(Luogu) P1441 砝码称重 (搜索+动态规划)
传送门解题思路:搜索出舍弃的方案,然后计算这种情况下能表示多少不同的数字,这里用一个动态规划,dp[i][j]:代表到第j个数,可以组成i这个数,则为true,反之则为false。最后只要知道dp[][n]有剁少个true则可以组成多少个数字。这里可以将二维压缩成一维,第二层循环稍微优化一下。#include<cstdio>#include<iostream>...原创 2019-02-16 14:36:15 · 353 阅读 · 0 评论 -
(Luogu) P1373 小a和uim之大逃离
传送门解题思路:这里dp要开4维,dp[i][j][t][p] 代表在 (i,j) 差值为t,p为角色(0为a,1为uim) 选择的方案数 。这样我们只要把dp[i][j][0][1]加起来就是所求的方案数了,其实条件是 dp[i][j][a[i][j]%(k+1)][0]=1; 因为每个点都可以为起点。如何更新状态的,我们这样规定 (A-B+k+1)%(k+1)=t%(k+1) (A为小...原创 2019-02-17 12:25:52 · 208 阅读 · 0 评论 -
(CodeForces) D. Flood Fill
视频题解戳我传送门题目大意:选择一个初始点,同色的为一个块,每一次可以将包含起始点块的左或右的那个方块变色,问最少操作次数。解题思路:对数据已经存在的同色块,留一个就好了,不影响结果。考虑若是1 2 3 4,都是不同色的,那要操作size-1次3次;若有1 2 1这种类似回文的,那就操作一次就行了,所有我们求出序列中最长的回文子序列长度/2 ,那就是我们可以节省的操作次数,我们可以将原...原创 2019-02-11 20:45:14 · 475 阅读 · 0 评论 -
(Luogu) P1273 有线电视网 (树型dp+分组背包)
传送门题目描述某收费有线电视网计划转播一场重要的足球比赛。他们的转播网和用户终端构成一棵树状结构,这棵树的根结点位于足球比赛的现场,树叶为各个用户终端,其他中转站为该树的内部节点。从转播站到转播站以及从转播站到所有用户终端的信号传输费用都是已知的,一场转播的总费用等于传输信号的费用总和。现在每个用户都准备了一笔费用想观看这场精彩的足球比赛,有线电视网有权决定给哪些用户提供信号而不给哪些用户...原创 2019-02-18 13:57:22 · 146 阅读 · 0 评论 -
动态规划——悬线法 (P1169 棋盘制作 p4147 玉蟾宫 p2701 巨大的牛棚 p1387 最大正方形)
学习于luogu p1169 第一篇题解悬线法用途: 解决给定矩阵中满足各种条件的最大子矩阵做法: 用一条线(横竖貌似都行)左右移动直到不满足约束条件或者到达边界定义数组: le[i][j]: 代表从(i,j)能到达的最左位置 ri[i][j]: 代表从(i,j)能到达的最右位置 up[i][j]: 代表从(i,j)向上扩展最长长度.预处...原创 2019-02-18 16:54:51 · 240 阅读 · 0 评论 -
(Nowcoder 2019国庆day5) E.Longest Increasing Subsequence(动态规划+思维)
传送门题意:f[i]是以i结尾的最长不下降子序列长度,问删掉第i个数后f[1]^2 xor f[3]^2 xor .. xor f[n]^2(不算第i个)解:如果对最长不下降子序列理解的彻底的会觉得很简单吧,我们可以考虑到当不考虑一个数是,那有些f[i]可能会不受影响或者-1,但是我们如何快速得出呢。当然是先全部求一遍f[]了,然后我们需要一个mi[]数组,mi[i]定义为长度为i的不下...原创 2019-10-05 17:14:57 · 162 阅读 · 1 评论