DP动态规划
The sunshine。
实在是太菜了 记忆力也不太好,,我还是写博客记录一下吧wuwuwuwu
展开
-
多重部分和问题(DP)
题意:思路:(1)状态:dp[i][j]:表示前i种数可不可以形成j(2)状态转移方程:前i种数可以形成j,那么意味着前i - 1种数可以形成j - a[i] 或j - 2 * a[i]或j - k * a[i]。dp[i][j] |= dp[i -1][j - k * a[i]]代码实现:#include<cstdio>#include<cstring>#include<stdlib.h>#include<iostream>#in原创 2021-04-21 17:40:41 · 107 阅读 · 0 评论 -
划分数(DP)
题意:有n个无区别的物品,将它们划分成不超过m组,求出划分方法数??思路:(1)状态:dp[i][j]:表示j的i划分数(2)状态转移方程:当j >= i时:dp[i][j] = dp[i - 1][j] + dp[i][j - 1];当j < i时:dp[i][j] = dp[i - 1][j];代码实现:void solve(){ dp[0][0]; for (int i = 0; i <= m; i++) { for (int j原创 2021-04-21 11:35:57 · 154 阅读 · 1 评论 -
01背包之2(重量范围大,价值范围小)
题意:有n个重量和价值分别为wi, vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值的最大值数据范围:W达到了10 ^ 9、wi达到了10 ^ 7;思路:(1)我们采取01背包的状态肯定是行不通的,dp[i][j]:前i个物品,总重量为j的最大价值,不用想,看看就知道了第二维的空间肯定会爆(2)那么我们可以转换状态啊,dp[i][j]:表示前i个,物品总价值为j时的最小重量。(3)然后就选取满足条件的最大的价值就好了代码实现:#include<cstdio&g原创 2021-04-21 11:22:47 · 206 阅读 · 0 评论 -
Traveling by Stagecoach POJ - 2686(状压dp)
题意:有一个旅行家计划乘马车旅行。他所在的国家里共有m个城市,在城市之间有若干道路相连。从某个城市沿着某条道路到相邻的城市需要乘坐马车。而乘坐马车需要使用车票,每用一张车票只可以通过一条道路。每张车票上都记有马的匹数,从一个城市移动到另一个城市的所需时间等于城市之间道路的长度除以马的数量的结果。这位旅行家一共有ñ张车票,第i张车票上马的匹数是Ti等。一张车票只能使用一次,并且换乘所需要的时间可以忽略。求从城市一个到城市b所需要的最短时间。如果无法到达城市b则输出”不可能”。思路:状压dp:(1)状态原创 2021-04-20 21:18:59 · 69 阅读 · 0 评论 -
7-13 至多删三个字符(dp+去重)
题意:思路:(1)状态:dp[i][j]表示前i个字符,删除j个的答案数量(2)状态转移方程删或者是不删删掉:dp[i][j] = dp[i - 1][j - 1] + dp[i][j];不删:dp[i][j] = dp[i][j] + dp[i - 1][j];(3)去重那么我们怎么去重呢?因为我们是从1开始的,遍历到后面的时候前面一定是去完重的。如果在j的范围内出现重复现象,dp[i][j] = dp[i][j] - dp[k - 1][j - (i - k)];代码实现:#i原创 2021-04-20 20:11:27 · 216 阅读 · 0 评论 -
POJ 3311 Hie with the Pie(状压dp/记忆化搜索)
题意:给你一个n+1(1<=n<=10)个点的有向完全图,用矩阵的形式给出任意两个不同点之间的距离。(其中从i到j的距离不一定等于从j到i的距离)现在要你求出从0号点出发,走过1到n号点恰好一次,然后再回到0号点所花的最小时间。输入:包含多组实例。每个实例第一个为n,然后是n+1行矩阵,每行矩阵有n+1个数字,第i行第j个数字表示从i-1到j-1号点的距离。当输入n=0时表示输入结束。输出:最小距离。思路:类似经典的TSP旅行商问题。。。每个节点仅走过一次,和每个节点至少走过一次都是原创 2021-04-20 19:35:30 · 97 阅读 · 0 评论 -
Codeforces Round #715 (Div. 2) C. The Sports Festival
题意:给了一个有n个数的数组s[maxn],现在b[i]代表的是前i个数的最大值和最小值之差, 求b[1]+b[2]+b[3]+b[4]+…b[n]思路:(1)我想了dfs,但是我没有考虑记忆化搜索,一直以为只有n <= 200才能dfs,我错了 。。(2)虽然有很多思路,但是都排除了,最后没有排除的就是贪心,但是有始无终,我错了。。(3)正解是区间dp,我对区间dp的理解就只停留在三层循环那里,emm~~,过于片面了,还是错了。。(4)那么区间dp怎么完成这道题呢?dp[i][j]表.原创 2021-04-17 13:12:51 · 598 阅读 · 0 评论 -
DP_lcm + 分组背包
题意:给一个数b,现在让我们分成A+ B + C + D +… = b,现在要使lcm(A,B,C,D…)最大,输出ln(lcm)输入:一个T,代表多组一个b输出:ln(lcm)思路:首先要使lcm最大,那么A,B,C,D…要么是质数,要么是质数的几次幂,我们可以按照质数分组,这就转换成了分组背包的问题。最终求ln就好了代码实现:#include<bits/stdc++.h>using namespace std;typedef long long ll;const原创 2021-01-12 22:33:29 · 66 阅读 · 0 评论 -
DP_动态规划+floyd算法
题意:有n个城市,每个城市都有一个被抢劫的危险值r[i],现在有q次询问,每次问从城市u到城市v不经过危险值城市大于w的最短路径。。输入:一个t,代表总共有t组样例对于每组样例首先输入一个n和一个q然后输入n x n的一个矩阵,代表城市i 和 城市j 之间的路径长度接下来就是q次询问每次询问输入一个u,v,w输出:q行,每行对应于每次询问的最短路径思路:floyd算法变形1.首先将城市按危险值从小到大进行排序2.然后我们用dp[k][i][j]代表从城市i到城市j经过第k危险的城市原创 2021-01-10 14:26:54 · 146 阅读 · 0 评论 -
DP_求不开心的天数的最小值
题意:alice现在有n门课要出成绩了,第i天出第i门课的成绩,但是如果第i门课的成绩a[i]低于前i门课的平均成绩,第i天alice就会不开心,但是Bob希望alice开心,他现在可以将a[i]换为b[i],问alice最少有多少天不开心??(alice第一天一定是开心的)输入描述:第一行,输入n接下来的n行,每一行输入一个a[i]和b[i]输出描述:Output the minimum number of the days that Alice will be sad.输入41 22原创 2021-01-05 09:29:03 · 171 阅读 · 0 评论 -
DP_求平衡二叉树的种类数
题意:1412 AVL树的种类平衡二叉树(AVL树),是指左右子树高度差至多为1的二叉树,并且该树的左右两个子树也均为AVL树。 现在问题来了,给定AVL树的节点个数n,求有多少种形态的AVL树恰好有n个节点。输入一行,包含一个整数n。 (0 < n <= 2000)输出一行表示结果,由于结果巨大,输出它对1000000007取余数的结果。输入样例10输出样例60思路:经典dp状态:dp[i][j]:代表顶点有i个,深度为j的形态的树有多少种。i个顶点除去自己,左右原创 2020-12-13 18:32:59 · 990 阅读 · 0 评论 -
DP_树形dp(求每一个点到其他n - 1个点的距离之和)
题意:1405 树的距离之和给定一棵无根树,假设它有n个节点,节点编号从1到n, 求1-n这n个节点,到其他n-1个节点的距离之和。输入第一行包含一个正整数n (n <= 100000),表示节点个数。后面(n - 1)行,每行两个整数表示树的边。输出每行一个整数,第i(i = 1,2,…n)行表示所有节点到第i个点的距离之和。输入样例41 23 24 2输出样例5355思路:树形dp1.任选一个节点,设定为树的根。用num[x]表示以节点x为根的子树的节点原创 2020-12-13 17:20:11 · 723 阅读 · 0 评论 -
DP_二分搜索 or LIS
题意:1294 修改数组给出一个整数数组A,你可以将任何一个数修改为任意一个正整数,最终使得整个数组是严格递增的且均为正整数。问最少需要修改几个数?输入第1行:一个数N表示序列的长度(1 <= N <= 100000)。第2 - N + 1行:每行1个数,对应数组元素。(0 <= A[i] <= 10^9)输出输出最少需要修改几个数使得整个数组是严格递增的。输入样例512234输出样例3思路:(1) 题目要求是严格递增的qaq。。首先考虑第一种i原创 2020-12-10 18:41:19 · 80 阅读 · 1 评论 -
DP_最长递增路径
题意:1274 最长递增路径一个无向图,可能有自环,有重边,每条边有一个边权。你可以从任何点出发,任何点结束,可以经过同一个点任意次。但是不能经过同一条边2次,并且你走过的路必须满足所有边的权值严格单调递增,求最长能经过多少条边。以此图为例,最长的路径是:3 -> 1 -> 2 -> 3 -> 2 或3 -> 1 -> 2 -> 3 -> 4 长度为4。输入第1行:2个数N, M,N为节点的数量,M为边的数量(1 <= N <= 5原创 2020-12-09 21:15:58 · 213 阅读 · 0 评论 -
DP_等差数列的最长上升子序列
题意:1241 特殊的排序一个数组的元素为1至N的整数,现在要对这个数组进行排序,在排序时只能将元素放在数组的头部或尾部,问至少需要移动多少个数字,才能完成整个排序过程?例如:2 5 3 4 1 将1移到头部 =>1 2 5 3 4 将5移到尾部 =>1 2 3 4 5 这样就排好了,移动了2个元素。给出一个1-N的排列,输出完成排序所需的最少移动次数。输入第1行:1个数N(2 <= N <= 50000)。第2 - N + 1行:每行1个数,对应排列中的元素。原创 2020-12-08 18:55:36 · 127 阅读 · 0 评论 -
DP_纪念第一次写出来dp
题意:1154 回文串划分有一个字符串S,求S最少可以被划分为多少个回文串。例如:abbaabaa,有多种划分方式。a|bb|aabaa - 3 个回文串a|bb|a|aba|a - 5 个回文串a|b|b|a|a|b|a|a - 8 个回文串其中第1种划分方式的划分数量最少。输入输入字符串S(S的长度<= 5000)。输出输出最少的划分数量。输入样例abbaabaa输出样例3思路:算了,对我这种菜鸡来说,很友好的了。。状态:dp[i]表示前i个数划分形成的回文串的原创 2020-12-08 18:41:44 · 128 阅读 · 0 评论 -
DP_多段 “连续子段和” 的最大值问题
题意:给一段连续的序列S1, S2, S3, S4 … Sx, … Sn (1 ≤ x ≤ n ≤ 1,000,000, -32768 ≤ Sx ≤ 32767).我们定义了sum(i, j) = Si + … + Sj (1 ≤ i ≤ j ≤ n).现在求的是:sum(i1, j1) + sum(i2, j2) + sum(i3, j3) + … + sum(im, jm) maximal (ix ≤ iy ≤ jx or ix ≤ jy ≤ jx is not allowed).也就是m段不相交原创 2020-12-08 18:24:10 · 159 阅读 · 0 评论 -
DP_流水线调度问题与Johnson算法
题意:1205 流水线调度N个作业{1,2,…,n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工,然后在M2上加工。M1和M2加工作业i所需的时间分别为a[i]和b[i]。你可以安排每个作业的执行顺序,使得从第一个作业在机器M1上开始加工,到最后一个作业在机器M2上加工完成所需的时间最少。求这个最少的时间。输入第1行:1个数N,表示作业的数量。(2 <= N <= 50000)第2 - N + 1行:每行两个数,中间用空格分隔,表示在M1和M2上原创 2020-12-08 11:49:14 · 579 阅读 · 0 评论