![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
dp
SundayJerry
这个作者很懒,什么都没留下…
展开
-
P2986 [USACO10MAR]Great Cow Gathering G(换根dp)
这题和P3478 [POI2008]STA-Station本质上是一样的,都是用换根dp进行解决贴一个换根dp分析之后我们就可以通过一次自上而下和自下而上的换根dp,进行求解Size表示子树大小dp[i]表示当前i到子树整个连通块的所有节点的长度d[i]表示当前以i为根节点到其它节点的总长度a[i]表示在i节点有多少头牛#include<bits/stdc++.h>#define ll long long#define pii pair<int,int>usin原创 2021-10-19 20:33:28 · 182 阅读 · 0 评论 -
P3478 [POI2008]STA-Station(换根dp模板)
给定一个 n 个点的树,请求出一个结点,使得以这个结点为根时,所有结点的深度之和最大.一个结点的深度之定义为该节点到根的简单路径上边的数量.思路:我们在一开始解的时候,如果我们要进行暴力求解我们的时间复杂度是O(n ^ 2),之后我们可以考虑对于样例1时,当前为根节点为1时那么由这个方法我们可以通过两次dfs进行求解第一次dfs,以1为根节点,自上而下求出每个节点的深度d,和每个节点的子树大小Size第二次dfs,以1为根节点,自下而上,求出每个节点为根节点的总深度之和最后遍历一遍dp数组找到深原创 2021-10-19 20:26:47 · 131 阅读 · 0 评论 -
P2170 选学霸(并查集 + 背包dp)
P2170 选学霸解法:我们可以把k对利用并查集链接起来,之后我们可以把每一个连通块当作一个背包的物品,因为题意求的是abs(选择的学霸 - m),我们的背包体积开成2 * m即可#include<bits/stdc++.h>#define ll long longusing namespace std;const int maxn = 1e5 + 100;int fa[maxn],d[maxn],a[maxn],dp[maxn];int find(int x){ if(x =原创 2021-10-17 21:30:23 · 118 阅读 · 0 评论 -
Codeforces Round #748 (Div. 3)F. Red-Black Number(记忆化 + 标记数组优化剪枝)
F. Red-Black Number题意:给你一个n位的数字 让你把n位数分别染上红色或者黑色 染上红色的需要整除A个数记为r,染上黑色需要整除B个数记为b,让我们求abs(r - b)最小,2 <= n <= 40, 1 <= A,B <= 40思路:首先我们可以看到,有n位数字分成两半,那么我们一定可以想到暴力枚举所有方案就有2^n - 1种方案对吧,那么之后我们就可以想如何进行优化.对于染成红色的数之和记作flaga, 染成红色的数记作flagb, 那么我们可以看到对于原创 2021-10-17 13:25:51 · 220 阅读 · 0 评论 -
分组背包问题
Acwing 分组背包问题有 N 组物品和一个容量是 V 的背包。每组物品有若干个,同一组内的物品最多只能选一个。每件物品的体积是 vij,价值是 wij,其中 i 是组号,j 是组内编号。求解将哪些物品装入背包,可使物品总体积不超过背包容量,且总价值最大。输出最大价值。解法:相较于其它背包,这个题目的分组背包就是对于一组物品我们只能进行选择一个,那么我们还是需要进行考虑当前有状态转移有几个维度,当然第一维度肯定是for(int i = 1; i <= n; i++)表示第几组物品,第二维度就是f原创 2021-10-16 22:55:43 · 259 阅读 · 0 评论 -
多重背包问题 II(二进制拆分技巧)
Acwing 多重背包问题 II有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。0< N <= 1000 0 < V <= 2000,0 < v,w,s<= 2000解法:看到第一眼N的范围是1000,物品个数0 < s <= 2000这样的话我们可以考虑合并,我们可以把多个相同物品合并成一个这样就能将问题转化成01原创 2021-10-16 22:44:36 · 250 阅读 · 0 评论 -
多重背包问题 I
Acwing 多重背包问题 I有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。1 <= N,V <= 100相较于完全背包和01背包, 多重背包的就是物品使用次数有限,我们可以考虑多一维表示当前物品的使用次数, 那么我们状态转移就有三维状态,第一维就是for(itn i = 1; i <= n; i++)表示当前是哪个物品,第二维与01背包相同就原创 2021-10-16 22:32:46 · 113 阅读 · 0 评论 -
完全背包问题
Acwing 背包题有 N 种物品和一个容量是 V 的背包,每种物品都有无限件可用。第 i 种物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。解法:相较于01背包,完全背包的物品是无限件用的,那么我们只需要进行一个小改动,第一维还是for(int i = 1 ; i <= n; i++)第二维需要改变一下,就是从体积小的开始for(itn j = a[i].v; j <= V; j++)转移方程还是dp[j] = ma原创 2021-10-16 22:23:36 · 64 阅读 · 0 评论 -
01背包问题
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大输出最大价值. 1 <= N,V <= 1000解法:经典01背包问题,由于N,V比较小我们可以直接采取N*V进行,第一维就是1-N表示物品,第二维for(int j = V; j >= a[i].v; j–),转移方程就是dp[j] = max(dp[j], dp[j - a[i].v] + a[i].w)即可原创 2021-10-16 22:17:34 · 69 阅读 · 0 评论 -
1427C - The Hard Work of Paparazzi(dp + 简单优化)
题意:已知有r条从西到东的街道和r条从北到南的街道,之后有n行,每一行包含t_i,x_i,y_i,t_i表示t_i秒这个人出现在(x_i,y_i)这个点,假设当前你在(x,y)点,那么你到(x_i,y_i)去接这个人需要花费abs(x-x_i)+abs(y-y_i)的时间,开始你在起点(1,1),求你最多能够接多少个人解法:考虑dp,dp[i]表示前i个人最多能够接多少个人,之后我们进行维护一个mx[i]表示维护对于[1,i-1]个人最多能够接多少个人,之后就可以通过mx数组进行优化即可#include原创 2021-09-10 21:45:46 · 105 阅读 · 0 评论 -
F. Clear the String(区间dp)
题意:给你一个长度为n的字符串,之后你可以进行操作,一次操作,你可以删除一段连续相同的字符串,求最小操作次数使得字符串全部被删完。解法:考虑区间dp#include<bits/stdc++.h>using namespace std;const int maxn = 5e2 + 100;int dp[maxn][maxn];char str[maxn];int main(){ int n; scanf("%d%s",&n,str+1); for(int i = 1;原创 2021-09-07 21:41:34 · 125 阅读 · 0 评论 -
432D - Prefixes and Suffixes(kmp + dp)
原题链接题意:给你一个字符串s,让你求出一个前缀和后缀相等,并在字符串s中出现的次数。解法:kmp,对于kmp中的next数组next[j]表示在模板串s[1,j]中前缀和后缀相同的最大长度。那么我们就可以通过kmp的next数组进行匹配。next[len]获得的就是 前缀1-next[len]匹配的后缀len-next[len]+1。next[next[len]]表示前缀子串1-next[next[len]]匹配的n-next[next[len]]+1-len后缀,之后通过这个性质,我们可以利用这原创 2021-08-21 20:04:17 · 99 阅读 · 0 评论 -
CF1363E. Tree Shuffling(树形dp)
原题链接给你n个节点,根节点为1,第i个节点花费a_i,装入了数字b_i,它想要最后将数字c_i最后写入第i个节点。你有一种操作,就是使得u节点的子树的k个节点进行交换,产生的花费为k*a_u,求最小花费解法:考虑树形dp,题目已知1为根节点,我们可以从上往下遍历,维护一个a[i]的最小值,如果当前遍历节点的值a[i]为最小值,那么就是当前的进行修改花费是最少的,更新答案即可,注意一点更新完之后,1号节点还有剩余未匹配节点,说明无法进行交换输出-1#include<bits/stdc++.h&原创 2021-08-21 19:38:56 · 98 阅读 · 0 评论