动态规划
qq_38232157
这个作者很懒,什么都没留下…
展开
-
洛谷 P1854 花店橱窗布置(算法竞赛进阶指南,线性DP)
算法竞赛进阶指南347页,线性DP题目:每一排选一个数,求一个最大的和,要求前一排选的数比后一排选的数靠左。本题要点:1、状态表示:dp[i][j] 表示前 i朵花,放入前j个花盆中,获得最大值。vis[i][j] = true, 如果 dp[i - 1][j - 1] + mp[i][j] > dp[i][j - 1]2、状态转移dp[i][j] = max(dp[i][j - 1], dp[i - 1][j - 1] + mp[i][j]);3、输出方案:每一行从右往左找,找到原创 2020-10-12 16:16:17 · 207 阅读 · 0 评论 -
POJ 2264 Advanced Fruits (最长公共子序列 LCS)
最长公共子序列 LCS题目意思:两个单词长度分别是n, m, 求出最长公共子序列长度 lcs, 然后将连个单词合并,合并后单词总长度等于 n + m - lcs ,使得两个单词所有的字母都按顺序出现,输出 合并后的单词。本题要点:1、套用 LCS 的模板,算出最长公共子序列。 然后,找出这个子序列在 s1 和 s2 中各个字母的下标。这个需要不断的回溯寻找, 找到 s1[i] == s2[j] 的字母,然后存到数组 d1 和 d2 。d1 数组表示 最长公共子序列 在 s1 的各个下标2、输原创 2020-09-19 17:44:03 · 121 阅读 · 0 评论 -
HOJ 2182 Frog(简单DP)
简单DP本题要点:1、 注意,题目给出的昆虫的n个下标, 从 0 开始的。2、dp[i][j] 跳i步,落在坐标j上,最多吃多少昆虫。3、计算过程:假如前面 的 i - 1 步 的所有位置已经计算完了。 现在走了 i步, 坐标是 j。上一个状态可能是 走了 i - 1 步, 左边是 j - x (A <= x <= B). 也就是 转态 dp[i][j]可能是 转态 dp[i - 1][j - x] 转移而来的。 从 所有的 转态 dp[i - 1][j - x] (A <原创 2020-09-18 15:48:47 · 88 阅读 · 0 评论 -
HOJ 1087 Super Jumping!(最长严格递增子序列)
最长严格递增子序列题目意思:求解最大递增子序列和,这里要特别注意一点:这个题目不要求是连续的最大递增子序列。但是一定要注意是递增的!!本题要点:1、裸题的 LIS. n <= 1000, 复杂度 O(n^2).dp[i] 表示以i结尾的,最长严格递增子序列总和.然后套用 LIS 的模板, 得到数组 dp, 在dp 中找到最大值即可。#include <cstdio>#include <cstring>#include <iostream>#in原创 2020-09-18 14:53:19 · 83 阅读 · 0 评论 -
洛谷 P1091 合唱队形(最长递增子序列)
最长递增子序列本题要点:1、Left[i] 表示以i为结尾的最长严格递增子序列长度Right[i] 表示以i 为开头的最长严格递减子序列长度2、遍历 1 <= i <= n , 取 Left[i] + Right[i] - 1 的最大值。3、这里计算 Right 数组时候,把 身高数组 h 的数据翻转过来了,这样子算的是 以 第 i 个结尾的最长严格递增子序列。#include <cstdio>#include <cstring>#include <原创 2020-09-15 11:43:54 · 87 阅读 · 0 评论 -
洛谷 P1040 加分二叉树(动态规划,二叉树)
动态规划,二叉树本题要点:1、状态表示:dp[i][j] 表示 区间 [i,j] 的数作为二叉树,得到的最大得分2、边界:dp[i][i] = d[i]; // 只有一个点构成二叉树,最大得分就是该点的分值。3、转态转移:dp[i][j] = max{dp[k][k] + dp[i][k - 1] * dp[k + 1][j]}区间[i,j] 构成的二叉树,假设以 k 点为二叉树的根(i <= k <= j), 扫描所有的根,看看谁的得分最大。dp[1][n], 表示的就是 题原创 2020-09-13 16:39:44 · 133 阅读 · 0 评论 -
洛谷 P1018 乘积最大(线性dp,高精度)
线性dp,高精度本题要点:1、 状态表示:dp[i][j], 表示前i 个数,用 j个乘号得到的最大值隐含条件,就是 数的个数 i - 1 >= j2、 转移方程:dp[i][j] = max{dp[k][j - 1], num[k + 1, i]}, j <= k < inum[k + 1, i], 原来给出的字符串 s 从 k + 1 位 到 i位 所表示的数字。3、因为数太大,超过 long long 范围,使用高精度。涉及的高精度运算有大数 + 大数 bign原创 2020-09-11 12:04:56 · 109 阅读 · 0 评论 -
HOJ 4632 Palindrome subsequence(回文串,区间DP)
回文串,区间DP题目意思:找一个字符串里有多少个回文子序列。本题要点:1、转态表示:dp[i][j] 表示从i到j有多少个回文子序列2、转态转移dp[i][j] = dp[i + 1][j] + dp[i][j - 1] - dp[i + 1][j - 1]如果 s[i] == s[j], dp[i][j] = dp[i][j] + dp[i + 1][j - 1] + 1#include <cstdio>#include <cstring>#include &原创 2020-08-03 20:33:59 · 76 阅读 · 0 评论 -
POJ 3280 Cheapest Palindrome(回文串, 区间DP)
回文串题目意思:给出一个字符串,然后给出n个字符,删除该字符和插入该字符的花费。问:删除或插入若干字符,使得该字符串变为回文串,所需要的代价花费最少。注意到,删除某个字符和插入某个字符是等价的,用数组 w 存放某个字符 删除后插入的较小值即可。本题要点:1、状态表示:dp[i][j] 表示s的子区间 [i, j] 变为回文串的最小花费2、转态转移:dp[i][j] = dp[i + 1][j - 1], s[i] == s[j]dp[i][j] = min(dp[i + 1][j] +原创 2020-08-03 11:59:02 · 93 阅读 · 0 评论 -
HOJ 1003 Max Sum(LIS,基础DP)
LIS,基础DP题目意思:找到连续的子段,使得其和是最大的。输出 最大的和, 起点,终点。本题要点:1、状态表示:dp[i] 表示以a[i] 为结尾的最大连续子段的总和2、状态转移:dp[i] = dp[i - 1] + a[i], 如果dp[i - 1] >= 0dp[i] = a[i], 如果dp[i - 1] < 0#include <cstdio>#include <cstring>#include <iostream>usi原创 2020-08-02 18:12:22 · 103 阅读 · 1 评论 -
HOJ 1257 最少拦截系统(LIS, 裸题)
LIS题目的裸题序列的最长递增子序列的长度,就是最少需要的导弹拦截系统本题要点:1、转态表示dp[i] 表示以第i个数为结尾的最长递增子序列的长度2、转移方程dp[i] = max{0, dp[j]}, high[j] < high[i], 0 < j < i#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using na原创 2020-08-02 16:27:41 · 143 阅读 · 0 评论 -
HOJ 5119 Happy Matt Friends(基础DP, 滚动数组)
基础DP, 滚动数组题目大意:给你N个数,问有多少个子集,满足子集内所有数的xor和大于等于M本题要点:1、状态表示:dp[i][j] 表示前i个数,xor和为j的情况有多少种.这里用滚动数组(来两行数组)来存, long long dp[2][MaxN]。2、状态转移:dp[i][j] = dp[i - 1][j] + dp[i - 1][j ^ a[i]]dp[i - 1][j] 表示不选 a[i] 这个数dp[i - 1][j ^ a[i]] 表示选择a[i] 这个数(注意到 j ^原创 2020-08-02 12:48:44 · 105 阅读 · 0 评论 -
HOJ 1024 Max Sum Plus Plus(线性DP,滚动数组,经典)
题目意思:本题的大致意思为给定一个数组,求其分成m个不相交子段和最大值的问题参考:https://www.cnblogs.com/kuangbin/archive/2011/08/04/2127085.html状态dp[i][j]有前j个数,组成i组的和的最大值。决策: 第j个数,是在第包含在第i组里面,还是自己独立成组。方程 dp[i][j]=Max(dp[i][j-1]+a[j] , max( dp[i-1][k] ) + a[j] ) 0<k<j空间复杂度,m未知,n<原创 2020-08-02 11:15:36 · 74 阅读 · 0 评论 -
洛谷 P1725 琪露诺(单调队列,DP)
单调队列本题要点:1、转态表示:f[i]表示在i点能获得的最大冰点值2、状态转移方程:f[i] = ice[i] + max{f[j]}(i - r <= j <= i - l)3、 对于当前的i, f[i的状态由区间 [i - r, i - l] 的状态转移过来。用一个单调队列 ,记录区间 [i - r, i - l] 的状态的最大值。(记录下标即可)。队列的值是单调递减的。#include <cstdio>#include <cstring>#i原创 2020-07-17 14:52:09 · 149 阅读 · 0 评论 -
HOJ 2069 Coin Change(动态规划)
题目意思:有5种硬币, 币值分别是 1, 5, 10, 25, 50。题目给出 数n,求出由这5种硬币组成币值n, 有多少种选法。本题要点:1、状态表示:dp[i][j]表示用j个硬币实现i金额的方案数2、状态转移方程:for(int k = type[i]; k < MONEY; ++k) //5种硬币{dp[k][j] += dp[k - type[i]][j - 1];}#include <cstdio>#include <cstring>#in原创 2020-07-05 16:10:55 · 110 阅读 · 0 评论 -
洛谷P1541 乌龟棋(算法竞赛进阶指南,线性dp)
算法竞赛进阶指南,347页,线性dp本题要点:1、状态表示:f[a][b][c][d]:表示你出了a张爬行牌1,b张爬行牌2,c张爬行牌3,d张爬行牌4时的得分2、转态转移方程:假设牌1, 牌2,牌3,牌4分别出现了 a, b, c, d次。当前的坐标是x。 有x往回走1步,对应的最大得分是 f[a - 1][b][c][d],同理, 有x往回走2步,对应的最大得分是 f[a][b - 1][c][d],有x往回走3步,对应的最大得分是 f[a][b][c - 1][d],有x往回走3步,原创 2020-07-03 00:36:36 · 144 阅读 · 0 评论 -
CH5101 LCIS(算法竞赛进阶指南,线性dp)
算法竞赛进阶指南,266页,线性dp本题要点:1、转态表示f[i][j], 表示在 a[1] ~ a[i] 范围内,b[1] ~ b[j] 范围内,以b[j]结尾的LCIS 的长度2、转态转移方程a[i] != b[j], f[i][j] = f[i - 1][j];a[i] == b[j], f[i][j] = 1 + max{f[i - 1][k], 0 <= k < j}#include <cstdio>#include <cstring>#in原创 2020-07-02 20:34:54 · 110 阅读 · 0 评论 -
洛谷 P1352 没有上司的舞会(进阶指南,树形dp)
算法竞赛进阶指南,289页,树形DP本题要点:1、状态表示:dp[x][0] 以x为根节点的子树,x不参加,得到的最大 happy 值, dp[x][1] 就是 x参加的情况2、状态转移方程:a) x节点不参加,dp[x][0] = 求和 max(dp[y][0], dp[y][1]) (x 的所有的孩子 y)b) x 节点参加,那么x的所有下属 y(也就是子孩子) 都不能参加dp[x][1] = h[x] + 求和 dp[y][0]#include <cstdio>#in原创 2020-06-05 17:23:32 · 93 阅读 · 0 评论 -
POJ 1179 Polygon (区间DP, 进阶指南)
算法竞赛进阶指南, 284 页, 区间DP题目意思:有 n个点,每点都有一个整数(正,负, 0都可能), 用 n 条边把 n个点连成一个环形, 每条边上都有一个运算符(加号 或者 乘号)。现在任意删除一条边,剩下 n - 1 条边。加下来 进行 n - 1 步骤,每一步 ,玩家选择一条边,然后用该边两边的数值和边上的运算符运算,等到新的整数。然后替换原来的两个顶点和一条边。 依次操作,直到剩下最后一点。求这个数的最大值,还要输出,具体删除了哪些边能得到最大值(多个的话,按递增输出)本题要点:1、转原创 2020-05-20 12:42:37 · 166 阅读 · 0 评论 -
洛谷 P1880 [NOI1995]石子合并 (进阶指南,线性DP)
算法竞赛进阶指南,283页, 区间DP本题要点:1、原来的区间范围是 [1 ~ n], 因为是 环形,区间增大一倍,[1 ~ 2 * n]2、转态表示:dp[L][R] 表示第 L堆石头到第R堆石头合并为一堆,需要消耗最小的的体力3、转移方程:dp[L][R] = min{dp[L][k] + dp[k + 1][R]}(k的范围 L <= k < R) + (a[L] + a[L + 1] + … + a[R])#include <cstdio>#include &l原创 2020-05-20 01:25:43 · 250 阅读 · 0 评论 -
洛谷 SP703 SERVICE - Mobile Service(线性DP, 进阶指南)
算法竞赛进阶指南, 269 页, 线性DP本题要点:1、状态表示:假设三个服务员分别是 A,B,C, A在 位置 p[i],f[i, x, y]表示已经处理完前i个请求,而且另外两个服务员B, C在x,y 两地的安排方案 总数2、转态转移:A在 位置 p[i], B在x,C在y。 遍历x, y 可能的位置情况, 两重循环for(int x = 1; x <= m; ++x){for(int y = 1; y <= m; ++y){}}保证A,B,C不在同一位置的情况下,原创 2020-05-19 14:09:34 · 183 阅读 · 0 评论 -
洛谷 P1006 传纸条(线性DP, 进阶指南)
算法竞赛进阶指南, 270 页, 线性DP本题要点:1、状态表示:每一条路径的第i步和所在的坐标点 (x, y) 的关系 x + y == i + 2;因此,每条路径的三个未知量(i, x, y) 可以用两个 未知量来(i, x)表示 // y == i + 2 - xdp[i][x1][x2] 表示两条路径长度i,而且第一条路径末尾在x1行,第二条在x2 行,取得的最大值2、转态转移:根据路径的走向,分类讨论:1)第一条:往右, 第二条:往右2)第一条:往右, 第二条:往下3)第一条:原创 2020-05-19 12:54:37 · 120 阅读 · 0 评论 -
POJ 1742 Coins(多重背包,进阶指南)
算法竞赛进阶指南, 281 页, 多重背包(此处代码抄书上的)题目意思:n种硬币,每种硬币的币值 A[i], 数量C[i], 给出一个数值m 求出可以拼成 1 ~ m 这 m种币值的哪几种?本题要点:1、 多重背包 的 “直接拆分法”,bool f[MaxM]; //在阶段i, f[j] 表示前i种硬币是否能拼成面值j在状态i(遍历到第i中硬币时候) for(int k = m; k >= A[i]; --k) //币值 f[k] = f[k] | f[k - A[i]]; { f原创 2020-05-19 12:34:42 · 225 阅读 · 0 评论 -
POJ 2279 动态规划,进阶指南
算法竞赛进阶指南, 265 页题目意思:杨先生要给他的学生们拍照片。首先,站队状况是确定的,若第i行站了r[i]个人,则有r[1] ≥ r[2] ≥ … ≥ r[n],所有的行都是靠左对齐的。并且,在同一行和同一列里面,从左到右或者从上到下身高都是递减的。现在所有学生的身高都不相同,学生数不超过30个,行数不超过5。你需要求出所有可能的排队方法的总数。本题要点:1、 最多只有5 排,不够 5排凑够5排。 r[i] 表示第i排最多站几人2、 dp[i1][i2][i3][i4][i5] 表示 第原创 2020-05-17 14:55:56 · 135 阅读 · 0 评论