返回顶部

随笔分类 -  动态规划

摘要:题意:给你$n$个数,问你最少删去多少个数,使得剩下的数任意分成两组,两组数的所有元素均不同. 题解:我们先对这$n$个数求和,如果$sum$是奇数,那么我们不用删去任何元素.否则,我们对这$n$个数求整体的$gcd$,并对所有数去掉这些$gcd$.去掉后整体结果不变,但是其中一定会存在至少一个奇数 阅读全文
posted @ 2021-04-26 20:03 _Kolibri 阅读(51) 评论(0) 推荐(0)
摘要:题意:RT,老鼠可以在任意两点移动. 分析:由于$n$的范围非常小,我们考虑状压,我刚开始是用一维dp转移的,但是这样的话会出现一个问题,也就是我们从上一个状态转移过来时,会出现不同坐标但状态值相同的情况,那么我们用一维就不能确定哪个坐标是最优的,所以要用二维dp来进行转移.$dp[i][j]$表示 阅读全文
posted @ 2021-04-26 13:25 _Kolibri 阅读(73) 评论(0) 推荐(0)
摘要:题意:找出LCIS 题解:我们设$dp[i][j]\(为\)[a_1,a_i]\(和\)[b_1,b_j]$组成的并且以$b_j$结尾的最长公共上升子序列,若$a[i]!=b[j]$,那么$dp[i][j]=dp[i-1][j]$,如果$a[i]=b[j]$,那么我们就固定$a[i]$,从$dp[i 阅读全文
posted @ 2021-04-09 00:53 _Kolibri 阅读(50) 评论(0) 推荐(0)
摘要:题意:给你一组数,求LDS和最少需要多少块LDS 题解:第一问LDS随便写,关键是要怎么求出最少有多少个LDS,这里介绍一个dilworth定理:***对于任意有限偏序集,其最大反链中元素的数目必等于最小链划分中链的数目.***对偶一下,我们要求最小LDS的划分数目,那么也就是求LIS的元素数目. 阅读全文
posted @ 2021-04-08 23:53 _Kolibri 阅读(94) 评论(0) 推荐(0)
摘要:题意:有$n$个物品,每个物品的价值是$a_i$,每个物品只有一个,假如你买了价值为$a_x$的物品,那么你可以选择$k$个价值不大于$a_x$的物品一块打包送给你,但是必须要$k$个才行,不能多不能少,你现在有$p$块钱,问你最多能买多少物品. 题解:先对物品排序,假如我们要买$x$个物品,不难发 阅读全文
posted @ 2021-04-01 20:04 _Kolibri 阅读(58) 评论(0) 推荐(0)
摘要:题意:给你一个有向图,求最大半连通子图的总节点数和不同最大半连通子图的方案数. 题解: 用tarjan缩点后,注意缩点后建边的时候要判重,因为两个连通子图之间可能有很多条边,跑拓扑排序然后dp更新节点数和方案数即可,具体看代码. 代码: #include <bits/stdc++.h> #defin 阅读全文
posted @ 2021-04-01 13:23 _Kolibri 阅读(75) 评论(0) 推荐(0)
摘要:题意:有$n$块板子,一个能量为$k$的粒子,粒子可以直接穿过板子,当粒子穿过一个板子时,会产生一个反方向的能量为$k-1$的粒子,不存在能量为$0$的粒子,问你将能量为$k$的粒子从最左边向板子射出时,会产生多少粒子? 题解:我们记$dp[i][j]$,表示能量为$i$且要穿过$j$个板子的粒子能 阅读全文
posted @ 2021-03-31 11:03 _Kolibri 阅读(59) 评论(0) 推荐(0)
摘要:题意:RT,给你一个字符串,问你最少分割多少子串,满足这些子串均为D型回文串. 题解:首先,判断回文我们可以用字符串hash来处理,这里不再赘述. 我们设$dp_i$,表示遍历到$i$位置时我们最少要分割多少子串来满足条件,我们看D型回文串的第一个条件,那么有:\(dp[i]=min(dp[i],m 阅读全文
posted @ 2021-03-29 10:34 _Kolibri 阅读(66) 评论(0) 推荐(0)
摘要:题意:给你一组数,问你最少删去多少数,使得剩下的数,每个数都能整除数组中其它某个数或被数组中其它某个数整除. 题解:我们直接枚举所有因子,$dp[i]$表示$i$在数组中所含的最大因子数(当我们枚举到$i$时),然后用$dp[i]$更新以$i$作为因子的更大的数,注意,更新的时候$dp[j]=max 阅读全文
posted @ 2021-01-29 01:01 _Kolibri 阅读(60) 评论(0) 推荐(0)
摘要:题意:有一张有向图,每个点的权值为点$1$到该点的最短距离(每条边的长度为$1$),对于一条路径,这条路径上最多只能有一条边,这条边起点的权值不小于终点,现在要求每个点能到达路径上的点的最小权值. 题解:首先我们先用bfs求出每个点的权值,并且在求的同时用桶将点存起来,方便之后枚举权值的时候用,然后 阅读全文
posted @ 2021-01-19 14:49 _Kolibri 阅读(104) 评论(0) 推荐(0)
摘要:题意:给你一组数,每次可以选择拿走第$i$个数,得到$a[i]$的分数,然后对于分数值为$a[i]-1$和$a[i]+1$的值就会变得不可取,问能得到的最大分数是多少. 题解:$a[i]$最大取$2e5$,那我们可以枚举$[1,2e5]$的所有数字,用桶记录每个数出现的次数$cnt$,对于当前所枚举 阅读全文
posted @ 2020-12-07 16:24 _Kolibri 阅读(81) 评论(0) 推荐(0)
摘要:题意:给你两个字符串,每次取它们的子串C和D,然后求LCS,得到的贡献为$4*LCS(C,D)-|C|-|D|$,求最大贡献. 题解:首先应该了解$O(n^2)$的LCS的dp写法,然后在此基础上稍加改动,对于子串$C$和$D$,如果$c[i]=d[j]\(,那么他们的LCS应该\)+1$,长度也分 阅读全文
posted @ 2020-11-16 21:27 _Kolibri 阅读(133) 评论(0) 推荐(0)
摘要:题意:有一个$n$x$m$的棋盘,你需要从$(1,1)\(走到\)(n,m)\(,每次可以向右,右下,下走任意个单位,\).\(表示可以走,#表示一堵墙,不能通过,问从\)(1,1)\(走\)(n,m)$的方案数. 题解:走棋盘的经典问题的改编,唯一不同的地方在于,棋子可以在某一方向移动任意距离,而 阅读全文
posted @ 2020-11-16 20:15 _Kolibri 阅读(188) 评论(0) 推荐(0)
摘要:题意:有$n$个人,每个人的能力值是$a_i$,现在你想将这些人分成$k$组(没必要全选),但是每组中最高水平和最低水平的人的能力差值必须$\le 5$,问最多能选多少人. 题解:想了一会发现纯贪心写不了,必须要用dp来求解,先排序,我们记$dp[i,j]$,表示前$i$个人分成$j$组选的最多的人 阅读全文
posted @ 2020-11-10 00:27 _Kolibri 阅读(97) 评论(0) 推荐(0)
摘要:题意:有$r$X$r$的网格图,有$n$位名人,会在$t_i$时出现在$(x_i,y_i)$,如果过了$t_i$名人就会消失,从某一点走到另外一点需要花费的时间是它们之间的曼哈顿距离的值,你刚开始在$(1,1)$点,问你最多能给多少名人拍照. 题解:因为某个点是从另外一个点走过来的,所以我们不难想到 阅读全文
posted @ 2020-11-06 01:20 _Kolibri 阅读(91) 评论(0) 推荐(0)
摘要:题意:有$n$个菜在烤箱中,每个时刻只能将一个菜从烤箱中拿出来,第$i$个时刻拿出来的贡献是$|i-a[i]|$,你可以在任意时刻把菜拿出来,问将所有菜拿出的最小贡献是多少? 题解: 先对所有菜从小到大排序,因为$a_i$单调,我们可以枚举时刻$[1,2*n]$来进行DP,先更新第一道菜的状态,然后 阅读全文
posted @ 2020-10-28 20:51 _Kolibri 阅读(123) 评论(0) 推荐(0)
摘要:题意:给你一组数,选一些数出来组成一个排列,使得每个数都能被前一个数整除,求排列的最大元素. 题解:我们先用欧拉筛筛出$1e7$的质数,设$dp[i]$表示当前选的数都是$i$的约数且合法的最大元素值.所以我们可以用$dp[i]$去更新$i$的倍数的$dp$值,我们可以靠枚举$i$的素数倍来降低复杂 阅读全文
posted @ 2020-10-26 20:56 _Kolibri 阅读(217) 评论(0) 推荐(1)
摘要:题意:给你两个长度相同的数组,每次从两个数组中选数(也可以不选),但是不可以在同一个数组中连续选两次,问能选的最大值是多少? 题解:dp,$dp[i][0]$表示第$i$个位置不选,$dp[i][1]$表示第$i$个位置选第一个数组的数,同理$dp[i][2]$就是第二个,不选的话,$dp[i][0 阅读全文
posted @ 2020-10-24 20:10 _Kolibri 阅读(96) 评论(0) 推荐(0)
摘要:题意:有两个正整数$n$和$m$,每次操作可以使$n*=2$或者$n-=1$,问最少操作多少次使得$n=m$. 题解:首先,若$n\ge m$,直接输出$n-m$,若$2n>=m$,分$m$的奇偶判断一下,如果是奇数就输出$n-(m+1)/2+2$,是偶数就输出$n-m/2+1$.否则我们就需要用d 阅读全文
posted @ 2020-10-22 21:40 _Kolibri 阅读(70) 评论(0) 推荐(0)
摘要:题意:给出两个正整数$n$和$k$,构造一个长度为$k$的好序列$b_1,b_2,...,b_k(1\le b_1\le b_2\le ...\le b_k \le n)$,并且满足$b_i|b_{i+1}$,问最多能够造出多少这样的序列(同一个元素可以出多次). 题解:我们记$dp[i][j]$表 阅读全文
posted @ 2020-10-22 19:49 _Kolibri 阅读(79) 评论(0) 推荐(0)