随笔分类 - 动态规划
摘要:题意:有$n$个画家,$m$幅画,每个画家负责$m$幅画,只有前一个画家画完时,后面一个画家才能接着画,一个画家画完某幅画的任务后,可以开始画下一幅画的任务,问每幅画最后一个任务完成时的时间. 题解:这题可以用dp来写,当某个画家开始他的任务时,他的上一幅画的任务必须完成,并且他的前一个画家必须完成
阅读全文
摘要:题意:RT 题解:先对$p$排个序,然后设$dp[i]$表示前$i-1$个$p[i]$满足条件但是$p[i]\(不满足,即在\)[1,p[i]]$中不存在从$p[1]$到$p[i-1]$[的排列,比如说$p[1]=1$,\(p[2]=2\),\(p[3]=3\),则$dp[4]\(中一定不能存在\)
阅读全文
摘要:题意:有一个长度为$n$的序列,找出最大的长度不为$n$的子段和,问最大子段和是否小于所有元素和. 题解:最大子段和我们可以直接用dp来找,每次状态转移为:\(dp[i]=max(dp[i-1]+a[i],a[i])\),而我们不能求长度为$n$的子段和,所以可以跑两次,从$[1,n-1]\(和\)
阅读全文
摘要:题意:有$n$种花,每种花有$a_i$盆,现在要摆$m$盆花,花的种类从$[1,n]$有序排放,问有多少种方案数. 题解:这题可以借用01背包的思路,感觉更好想一点,我们首先枚举$n$种花,然后按一维01背包的思路,再枚举第$i$种花的选取盆数$[1,min(a_i,j)]$,每次状态都由$dp[j
阅读全文
摘要:题意:有一组数,分别用长度从$[1,n]\(的区间去取子数组,要求取到的所有子数组中必须有共同的数,如果满足条件数组共同的数中最小的数,否则输出\)-1$. 题解:我们先从后面确定每两个相同数之间的距离,然后维护每个$i$位置上的数到后面所有相同数的最大距离,然后我们就可以dp来搞了,我从$1$开始
阅读全文
摘要:题意:给你一组数$a$,构造一个它的子序列$b$,然后再求$b_1-b2+b3-b4...$,问构造后的结果最大是多少. 题解:线性DP.我们用$dp1[i]$来表示在$i$位置,并且此时子序列的长度是奇数的情况,而$dp2$则是偶数情况,对于每个$a_i$,$dp[i]$都可以选它或者不选,拿$d
阅读全文
摘要:题意:给你一个数字$n$和$k$个区间,$S$表示所有区间的并的集合,你目前在$1$,每次可以从集合中选择一个数字向右移动,问有多少种方法从$1$走到$n$. 题解:我们从1开始遍历,$dp[i]$表示走到目前走到$i$的方案数,再去遍历每一个集合,用$dp[i]\(更新所有\)[i+l[j],i+
阅读全文
摘要:题意:你和基友两人从左往右轮流打怪兽,强怪用$1$表示,垃圾用$0$表示,但基友比较弱,打不过强怪,碰到强怪需要用一次魔法,而你很强,无论什么怪都能乱杀,基友先打,每人每次至少杀一个怪兽,最多杀两个怪兽,问最少需要用多少次魔法能将怪兽全部打完. 题解:由于在打怪的过程中,每个状态都与之前息息相关,所
阅读全文
摘要:题意:有$n$枚硬币,每枚硬币抛完后向上的概率为$p[i]$,现在求抛完后向上的硬币个数大于向下的概率. 题解:我们用二维的$dp[i][j]$来表示状态,$i$表示当前抛的是第$i$个硬币,$j$表示的是前$i$个硬币中向上的个数,那么状态可以表示为,如果$j=0$,那么$dp[i][j]=dp[
阅读全文
摘要:题意:有一个$n$X$m$的图,"#"表示障碍物,"."表示道路,只能向右或向下走,问从左上角走到右下角的方案数. 题解:这题可以用bfs来搞,但dp更简单点吧~~.首先,只有当向右和向下都能走时,方案数才会增加,我们用dp表示从起点走到某个单位的方案数,这个单位只能从左边或上边走过来,所以它的方案
阅读全文
摘要:题意:给你一张DAG,求图中的最长路径. 题解:用拓扑排序一个点一个点的拿掉,然后dp记录步数即可. 代码: int n,m; int a,b; vector<int> v[N]; int in[N]; int dp[N]; int main() { //ios::sync_with_stdio(f
阅读全文
摘要:题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; int dp[10000][10000]; int main() { //ios::sync_with
阅读全文
摘要:题意:有$n$个物品,第$i$个物品价值$v_$,体积为$w_$,你有容量为$W$的背包,求能放物品的最大价值. 题解:经典01背包,但是物品的最大体积给到了$10^9$,dp数组下标会造成越界,因此我们不能用dp下标来存物品的体积,但是我们发现,物品的价值范围很小,所以我们反着想,枚举所有可能的总
阅读全文
摘要:题意:有两个数组$a$和$b$,每次比较它们最左端的元素,取小的加入新的数组$c$,若$a$或$b$其中一个为空,则将另一个全部加入$c$,现在给你一个长度为$2n$的数组$c$,问是否能有两个长度为$n$的数组$a$和$b$构成. 题解:我们从左向右看$c$,记一个最大值$mx$,观察样例不难发现
阅读全文
摘要:题意:有一个字符串$s$,我们可以选择$s_$,如果$s_{i+k}>s_$,那么就可以交换$s_$和$s_{i+k}$,问最多能够交换多少次. 题解:因为限定了$k$,所以我们交换的位置是固定的,即所有能交换的位置的$i$%$k$都相等,那么对于某个位置$i$,在它之前的$i$%$k$相等的位置的
阅读全文
摘要:题意:有一个整数$n$,每次可以对加$10x$或减$10x$,问最少操作多少次能得到$n$. 题解:对于某一位上的数,我们可以从$0$加几次得到,或者从前一位减几次得到.所以对于每一位,我们都要求得一个最优解,所以用dp来写. dp数组的一维表示当前的位置,二维表示是用第一种情况还是第二种情况. 而
阅读全文
摘要:题意:给你一个长度为$n$的序列,求一个最长的${x,x+1,x+2,.....,x+k-1}$的序列,输出它的长度以及每个数在原序列的位置. 题解:因为这题有个限定条件,最长序列是公差为$1$的单增序列,所以其实非常简单. 我们用$map$来记录每个元素最后出现的位置,$dp$表示当前位置的最
阅读全文
摘要:题意:给你一个体积为$T$的背包,有$n$个物品,每个物品的价值和体积都是是$a_$,求放哪几个物品使得总价值最大,输出它们,并且输出价值的最大值. 题解:其实就是一个01背包输出路径的裸题,直接上板子就行了.(一维的背包写法其实还是不太怎么怎么理解,具体的以后再补). 代码: #include <
阅读全文
摘要:题意:给两个长度为$n$的全排列,求他们的LCS 题解:这题给的数据范围到$105$,用$O(n2)\(的LCS模板过不了,但由于给的是两个全排列,他们所含的元素都是一样的,所以,我们以第一个串为模板,第二个串的每一个元素都能对应到第一个串的元素的位置,第二串对映后的最长上升子序列,就是他们的LCS
阅读全文
摘要:题意:有一个长度为$n$的序列$a$,求一个最长上升子序列,且这个子序列的元素在$a$中的位置满足$i_{j+1}modi_=0$,求这个子序列的最大长度. 题意:这题假如我们用$O(n^2)$的朴素DP来求肯定是会TLE的,我们在原有的方法上做一些优化. 我们首先遍历$a$,确定子序列的首位置
阅读全文

浙公网安备 33010602011771号