摘要:
简单来说就是背包问题与树形 DP 的结合 让我们来看个例题 https://www.luogu.com.cn/problem/P2014 这道题的思路如图: ac代码如下: #define NMAX 303 int dp[NMAX][NMAX];//1维->节点编号 2维选了多少门课 //dp[u] 阅读全文
摘要:
最小生成树的 Kruskal 算法,非常简单易懂 先按照边权从小到大排序。 依次将边的两个点加入到树中,加入前判断一下,这两个点是否已存在于树中(使用并查集 https://www.cnblogs.com/kingbuffalo/p/15380294.html) 并查集需要记录每个森林中有几个节点时 阅读全文
摘要:
混合背包就是指,既有01背包,完全背包,多重背包。 解法很简单,就是对第二层for循环分情况讨论。 直接来题吧 此处多重背包使用二进制优化算法,当然也可以使用单调队列进行优化 详见 https://www.cnblogs.com/kingbuffalo/p/16285929.html 题:https 阅读全文
摘要:
区间dp一般是 形如 dp[i][j] = oper(dp[i][k],dp[k+1][j] ) + cost[i..j]; 其中 oper可能是 求最大最小值,或乘法或加法,等等。 的dp 有一个比较简单题,可以对区间dp有个基本的了解https://www.acwing.com/problem/ 阅读全文
摘要:
单源最短路径算法,其实就是进行松驰的算法。 有Dijkstra/Bellman ford/SPFA 这三种算法 如图所示: 算法模板: 共用代码 #define NMAX 105 #define EMAX 10005 int head[NMAX]; int dist[NMAX]; int ver[E 阅读全文
摘要:
要求: 看此文需要如下要求。 1,熟悉01背包及完全背包,对01背包/完全背包中的逆序和顺序选择的原因要了解。https://www.cnblogs.com/kingbuffalo/p/16241927.html 2,熟练使用单调队列求滑动窗口中的最大值 https://www.cnblogs.co 阅读全文
摘要:
问题 完全背包 有n个物品 已经第i个物品重量wi 价值vi 无数个 总背包容量 W 01背包 有n个物品 已经第i个物品重量wi 价值vi 只有1个 总背包容量 W 思路: 设dp[i][j] i为考虑前i个物品时 j为背包总量。 则有 无后效性:i为前i个物品考虑, j为总量,两者均从小到大增加 阅读全文
摘要:
也是非常经典的一道题 比较简单的做法是: 设dp[i] i: 以nums[i]作为一个子数组的,最长的上升子序列 则有 无后效性:i肯定不会影响i之前的。 子问题重叠:算i+1,i+2 .. n 时,都需要dp[i] 最优子结构:for( int j=0;j<i;++j ) if ( nums[j] 阅读全文
摘要:
非常经典的一道题 设dp[i][j]为最长公共子序列 i:s1以i为结尾的字符串 j:s2以i为结尾的字符串 则有 无后效性:i+1与j+1 不会影响之前的 子问题重叠:使用i-1, j-1 来代表已经对的结果 最优子结构:dp[i][j] = s[i-1] == s[j-1] ? dp[i-1][ 阅读全文
摘要:
题 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 问:最大和是多少。 思路图解 设dp[i][j] i 为第i 行,j 为 第i行的第j个数字时。 则有 无后效性:向下选择的时候不会影响之前的选择 子问题重叠:使用dp[i-1] 来代表上一行已经选好的结果 最优子结构:dp[i][j] 阅读全文