动态规划篇
动态规划
桑榆207
在最终的结果到来之前,任何肯定会赢之类的话都是虚无缥缈的。
展开
-
LeetCode 221. 最大正方形 1277. 统计全为 1 的正方形子矩阵 DP
思路:221题和1277题非常相似,思路也相同,不同的是状态转移方程变了一点,由取最大值,变成了加法。以最大正方形为例,考虑当前i行j列,dpij代表为右下顶点为ij的正方形的最大边长,那么状态是由三个方向的状态转移而来的,分别是相邻左边,相邻上边,相邻左上角。所以,dp[i][j]=1+min(dp[i][j-1],dp[i-1][j],dp[i-1][j-1])。代码:cla...原创 2020-04-16 18:54:11 · 273 阅读 · 0 评论 -
LeetCode 85. 最大矩形 单调栈+DP
思路:由于给出的是一个矩阵,那么我们可以把他们抽象成直方图,dpj代表到当前第i行为止、第j列的累计长度。然后每一行统计完之后求一下直方图的最大面积(单调栈),然后一共求出n行的最大面积,取最大值即可。如果当前长度大于栈顶长度,那么进栈,否则,例如到第4个长度时,不断出栈,wi代表以第i个长度为高,底边可以扩展的最大长度。出栈的同时,不断累加wi[p],然后再把第四个入栈。这个过程...原创 2020-04-15 23:04:49 · 213 阅读 · 0 评论 -
牛客 树学 树形dp
思路:如果是求根为1的点,整棵树的深度和,我们可以用一次dfs来统计每个节点的深度。现在考虑换根:我们发现现在的根2的子树及2本身的深度都减1,其余点的深度都加1。那么我们不仅需要统计每个点的深度,而且要统计每个节点子节点的数量cnti,再需要一次dfs。然后最后一次dfs是dp的过程,考虑对于换根点v,其原来父节点为u,那么dpv=f[u]-cnt[i]+(n-cnt[i])。...原创 2020-04-15 10:01:23 · 219 阅读 · 0 评论 -
LeetCode 673. 最长递增子序列的个数 DP
思路:利用dpi记录末尾为ai的最长递增子序列的长度,sj代表末尾为ai的最长上升子序列的个数。考虑aj>ai时的情况,情况1如下,此时sj应该为si,因为.. ai aj是一个上升子序列。情况2如下,此时sj+s[i],因为... xaj已经为一条上升子序列(x不为ai),那么也可以经过ai得到这条上升子序列,将sj累加si。代码:class Solution...原创 2020-03-26 21:37:29 · 151 阅读 · 0 评论 -
LeetCode 983. 最低票价 DP
思路:考虑第i天的最低票价,因为三种票分别可以作用1天、7天、30天,那么第i天的票价受到第第i-1天、第i-7天、第i-30天的影响,而且在这些天时,我们要再买一个costj,才可以作用到第i天,例如,第i-7天最低票价是f[i-7],那么再买一个cost1,才可以作用到第i天。代码:class Solution{public: int dp[1000]; bo...原创 2020-03-23 19:03:19 · 201 阅读 · 0 评论 -
Bone Collector II HDU - 2639 01背包求K大值
题意:给出商品价值、体积,以及背包能装的最大容量,求出能装入的第K大的价值。如能装入的价值为20 12 2,那么第2大的就是12.思路:给0-1背包增加一个维度,dpjk代表装入容量为j时第k大的价值。我们每次合并dp[j][k]和dp[j-w[i]][k]+v[i],取前k大进行更新。代码:#include<bits/stdc++.h>#define...原创 2020-03-19 11:59:25 · 155 阅读 · 0 评论 -
Buy the souvenirs HDU - 2126 01背包求最值和方案数
题意:给出n种物品和钱数,已经n中物品的价格,求出最多可以买到的物品,以及有多少方案可以买到最多物品。思路:考虑到状态转移方程,dpj代表花费钱数j时所能买到的物品,cntj代表花费钱数j时有多少种买法:即当可以买到更多物品时,更新dpj和cntj。cntj是取1和cnt[j-w[i]]的最大值的。而当选择或不选择第i件物品最大的方案数相同时,我们合并方案数。代码:...原创 2020-03-19 11:27:56 · 128 阅读 · 0 评论 -
牛客 双核处理 01背包
[编程题]双核处理时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32M,其他语言64M一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。输入...原创 2020-03-18 18:25:24 · 143 阅读 · 0 评论 -
LeetCode 279. 完全平方数 完全背包
279. 完全平方数难度中等333给定正整数n,找到若干个完全平方数(比如1, 4, 9, 16, ...)使得它们的和等于n。你需要让组成和的完全平方数的个数最少。示例1:输入: n = 12输出: 3 解释: 12 = 4 + 4 + 4.示例 2:输入: n = 13输出: 2解释: 13 = 4 + 9.思路:先把完全平方数求出来,然后求...原创 2020-03-17 00:03:22 · 215 阅读 · 0 评论 -
邮票 完全背包变形
问题 1666: [蓝桥杯][算法训练VIP]邮票时间限制: 1Sec 内存限制: 128MB 提交: 141 解决: 32题目描述给定一个信封,有N(1≤N≤100)个位置可以贴邮票,每个位置只能贴一张邮票。我们现在有M(M< =100)种不同邮资的邮票,面值为X1,X2….Xm分(Xi是整数,1≤Xi≤255),每种都有N张。显然,信封上能贴的邮资最小值是min(X1, ...原创 2020-03-05 17:45:46 · 256 阅读 · 0 评论 -
邮票面值设计 DFS+完全背包
问题 1576: [蓝桥杯][算法提高VIP]邮票面值设计时间限制: 1Sec 内存限制: 128MB 提交: 103 解决: 48题目描述给定一个信封,最多只允许粘贴N张邮票,计算在给定K(N+K≤13)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大值MAX,使在1~MAX之间的每一个邮资值都能得到。例如,N=3,K=2,如果面值分别为1分、4分,则在1...原创 2020-03-05 17:29:15 · 291 阅读 · 0 评论 -
背包问题总结
待写。原创 2020-02-15 22:27:57 · 103 阅读 · 0 评论 -
摆动序列 DFS DP
问题 1630: [蓝桥杯][算法训练VIP]摆动序列时间限制: 1Sec 内存限制: 128MB 提交: 72 解决: 44题目描述如果一个序列满足下面的性质,我们就将它称为摆动序列:1. 序列中的所有数都是不大于k的正整数;2. 序列中至少有两个数。3. 序列中的数两两不相等;4. 如果第i – 1个数比第i – 2个数大,则第i个数比第i – 2个数小...原创 2020-02-13 12:12:47 · 391 阅读 · 0 评论 -
Codeforces Beta Round #13 C. Sequence
题意:给出序列,对于每个数一次操作可以加1或减1,求使得序列成为不递减序列的最小操作次数。n<=5000ai<=1e9思路设dpij为前i个数符合条件且最大为bj结尾,b数组是离散化排好序后的数组。dpij=min(dp[i][j-1],dp[i-1][j]+abs(a[i]-b[j]))它等于这两者的最小值:前i个数以bj-1结尾,bj-1<=bj;...原创 2020-01-30 21:57:23 · 127 阅读 · 0 评论 -
HDU1160-FatMouse's Speed--最长上升子序列+记录路径
题意给出w和v属性,求w递增和v递减的最长子序列,并输出路径。思路先按照一个属性排序,在此基础上写一个dp转移,然后记录路径的时候利用pre思想,记录他的前驱。最后找答案的时候不断求pre得到答案。#include<bits/stdc++.h>using namespace std;#define ll long long#define maxn 6...原创 2019-11-08 22:18:48 · 114 阅读 · 0 评论