
动态规划
文章平均质量分 73
动态规划
Alice-柯
程序媛
展开
-
【C++】Floyd多源最短路算法
多源是指它可以求出以每个点为起点到其他每个点的最短路不过其实有一种情况求不出最短路,就是有负环的情况,此时可以不断地在环中转圈,而Floyd算法无法判断这样的情况,所以就只能在没有负环的情况下使用。Floyd算法是一种利用动态规划的思想,计算给定的带权图中任意两个顶点之间的最短路径的算法,无权图可以把每个边的边权看作1.我们用dp[k][i][j]dp[k][i][j]dp[k][i][j]表示iii到jjj能经过111~kkk的点的最短路,那么实际上dp[0][i][j]dp[0][i][j]dp[0原创 2022-07-05 15:18:23 · 440 阅读 · 0 评论 -
DAG(有向无环图)上的动态规划
动态规划最重要的是要找到一个情况的所有子情况,处理完所有子情况后把结果通过一定的方式转移得到这个情况的答案。那么很多时候我们会遇到或者可以构造出这样一个图,每个点是一种情况,每条边代表着这条边的终点是起点的一个子情况。首先这个图是有向的,如果他里面没有环,我们称之为有向无环图(DAG),我们可以在这个图上通过状态转移的到最后的答案。接下来我们考虑如何进行动态规划的状态转移。其实,想到一个合理的转移顺序不太容易,不妨尝试用记忆化搜索的方法来做,因为是无环的,每条路径一定会到达一个终点,不会陷入无尽的环原创 2022-06-22 17:35:40 · 633 阅读 · 0 评论 -
[C++]背包问题
总共n个商品可选择,每个商品你最多只能选择一个,第i个商品的体积为wi,价值为vi;背包的最大容积为V。问商品总体积不超过V所能得到的最大值。f[i][j]表示前i个物品体积之和不超过j的最大价值。f[i][j]=max(f[i−1][j−w[i]]+v[i],f[i−1][j])初始化f[0][0]=0答案为f[n][V]原创 2022-10-05 12:05:19 · 724 阅读 · 1 评论 -
动态规划——区间DP
区间DP:指在一段区间上进行的一系列动态规划对于区间DP这一类问题,我们需要计算区间[1,n][1,n][1,n]的答案,通常用一个二维数组dpdpdp表示,其中dp[x][y]dp[x][y]dp[x][y]表示区间[x,y][x,y][x,y]有些题目,dp[l][r]dp[l][r]dp[l][r]由dp[l][r−1]dp[l][r-1]dp[l][r−1]与dp[l+1][r]dp[l+1][r]dp[l+1][r]退到;也有题目,我们需要枚举[l,r][l,r][l,r]内的中间点,由两个子原创 2022-06-23 18:03:12 · 307 阅读 · 0 评论 -
状压DP——子集DP
我们直接通过一个例题来了解子集 DP,子集 DP 属于状压 DP 的一种。给定一个长度不超过 n 的字符串 s,如果 s 中的一个子序列是回文,那么我们就可以从 s 中移除这个子序列,求最少经过多少步我们可以移除整个字符串 s。如:我们可以从"dqewfretd"中移除 “defed”,剩下的字符串即:“qwrt”。使用状压DP进行求解:对于状态i,用dp[i]dp[i]dp[i]表示最少的操作次数当状态i对应的子序列是回文时,dp[i]=1对于状态i的一个子状态t,如果t也是回文序列,那么dp[原创 2022-06-20 16:58:27 · 795 阅读 · 0 评论 -
状态压缩动态规划进阶——旅行商TSP问题
旅行商问题,即 TSP 问题(Traveling Salesman Problem)又译为旅行推销员问题、货郎担问题,是数学领域中著名问题之一。假设有一个旅行商人要拜访 n 个城市,他必须选择所要走的路径,路径的限制是每个城市只能拜访一次,而且最后要回到原来出发的城市。路径的选择目标是要求得的路径路程为所有路径之中的最小值。TSP 是一道经典的 NP-完全问题,在规模比较小的时候可以用动态规划求解。有 nnn个城市,两两之间均有道路直接相连。给出每个城市 iii 和 jjj 之间的道路长度 dist(i,j原创 2022-06-19 16:02:49 · 1299 阅读 · 1 评论 -
学习笔记多线程动态规划——P1004
题目描述设有 N×N 的方格图 (N≤9),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字 0。如下图所示(见样例):A0 0 0 0 0 0 0 00 0 13 0 0 6 0 00 0 0 0 7 0 0 00 0 0 14 0 0 0 00 21 0 0 0 4 0 00 0 15 0 0 0 0 00 14 0 0 0 0 0 00 0 0 0 0 0 0 0B某原创 2022-05-12 18:55:22 · 438 阅读 · 0 评论 -
状态压缩动态规划进阶——方格取数问题
给定一个 n×mn \times mn×m 的矩阵,行数和列数都不超过 20,其中有些格子可以选,有些格子不能选。现在你需要从中选出尽可能多的格子,且保证选出的所有格子之间不相邻(没有公共边)。例如下面这个矩阵(2×32 \times 32×3的矩阵)最多可选 33 个互不相邻的格子,方案如下(选中的位置标记为x):解法详解我们可以自上而下一行一行选择格子。在选择格子的过程中,只和上一行选择的方案有关,所以我们可以将“当前放到第几行,当前行的选择方案”作为状态进行状态压缩动态规划。一行里被选择的格子原创 2022-06-19 16:41:07 · 264 阅读 · 0 评论 -
一题学会高维动态规划——”生日快乐“
当多个类型的动态规划模型结合在一起后。动态规划的维度就会叠加。虽然这类题目难度并没有增加很多,但我们需要花费更多耐心,防止其中的环节出现问题。我们来看一个从左上角到右下角,只能够向右或向下走类的动态规划和01背包相结合的问题:今天是蒜头君的生日,妈妈带蒜头君到 蛋糕花园 挑选爱吃的蛋糕。蛋糕花园 花园是一个 n 行 m 列的网格图。第 i 行第 j 列格子上放有w[i][j] 克的蛋糕。蒜头君从左上角走到右下角,只能够向右或向下走。当蒜头君走到这个方格时,他可以选择将这个方格上的蛋糕全部吃掉,或是一口都原创 2022-05-14 17:37:31 · 328 阅读 · 0 评论 -
动态规划前缀和优化动态规划
前缀和复习:设数组是a[]s[i]=a[0]+……+a[i]第i位到第j位的和为a[i]+a[i+1]+……+a[j]=(a[0]+……+a[j])-((a[0]+……+a[i-1])=s[j]-s[i-1]例如:给定n个数字a[1],a[2],a[3]……a[n],请你在其中取出任意段连续的数字,每段长度为k,要求选取的连续数字不能重复。求最大数字和。对于这个问题,我们很容易能定义状态dp[i],表示当i为最后一段结尾时最大的数字和。此时,状态转移方程是:dp[i]=max(dp[1],原创 2022-05-14 17:16:20 · 444 阅读 · 0 评论 -
状态压缩动态规划基础——传递物品
个人在做传递物品的游戏,编号为 1-n。游戏规则是这样的:开始时物品可以在任意一人手上,他可把物品传递给其他人中的任意一位;下一个人可以传递给未接过物品的任意一人。即物品只能经过同一个人一次,而且每次传递过程都有一个代价;不同的人传给不同的人的代价值之间没有联系。求当物品经过所有 nn个人后,整个过程的最小总代价是多少。我们很容易能够想到一个动态规划解法,状态为是否给过某个人以及现在在谁的手上,为了方便记录,数组下标从0开始,即当n=3时,就可以用dp[[2][2][2][3]dp[[2][2][2]原创 2022-06-19 15:45:09 · 191 阅读 · 0 评论