
线性dp
文章平均质量分 73
Brightess
毕业于湖南城市学院
目前在某游戏大厂搬砖(
展开
-
2022 牛客暑期多校2 K - Link with Bracket Sequence I(线性dp)
2022暑期多校 线性dp原创 2022-07-24 12:42:17 · 306 阅读 · 0 评论 -
AcWing 902. 最短编辑距离(线性dp 初始化细节)
题意:如题。思路:f[i][j] 状态表示 :集合:所有将 a[1 ~ i] 变成 b[1 ~ j] 的 操作方式属性:操作数的最小值 min状态计算 :依据最后一步考虑三种操作,对应 f[i][j] 代表集合共有 三个子集① 删除操作:把 a[i] 删掉之后 a[1 ~ i] 和 b[1 ~ j] 匹配所以之前要先做到 a[1 ~ (i-1)] 和 b[1 ~ j] 匹配f[i-1][j] + 1② 插入操作:插入之后 a[i] 与 b[j] 完全匹配,所以插入的就..原创 2022-03-26 22:59:45 · 345 阅读 · 0 评论 -
AcWing 897. 最长公共子序列(线性dp LCS问题)
题意:给定两个字符串,求两串的最长公共子序列(LCS问题)思路:直接上dp分析:f[i,j] 状态表示:**集合:**所有 a[1 ~ i] 与 b[1 ~ j] 的 公共子序列 的集合属性:长度的最大值 max状态计算:时间复杂度:O(nm)O(nm)O(nm)(n、m 分别为两个字符串的长度)代码:#include<bits/stdc++.h>using namespace std;const int N = 1010;int dp[N][N];int n..原创 2022-03-26 20:56:07 · 1125 阅读 · 0 评论 -
AcWing 896. 最长上升子序列 II(贪心 + 二分 lower_bound)
本题是AcWing 895. 最长上升子序列的数据强化版,数据范围n<=1e5,可知原来O(n^2)的做法已经行不通了。因此我们至少应当将时间复杂度控制在O(nlogn)以内。思路:贪心 + 二分贪心思想:对于 最大上升子序列,结尾元素越小,越 有利于后面接上其他的数,也就 变得更长。贪心策略:建立一个 q 数组,元素 q[i] 表示 长度为 i 的 LIS 结尾元素 的 最小值,因此我们只需要维护 q 数组即可。具体措施:设 原数组为 a,q 数组中元素 q[i] 表示 长度为 i 的.原创 2022-03-26 16:50:44 · 503 阅读 · 0 评论 -
AcWing 898. 数字三角形(线性dp)
从这篇文章开始我们来好好啃啃dp这根硬骨头,仔细分析一下它的套路和一般做法,下面这道题是每个学dp的人应该都要接触的题目给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。输入格式第一行包含整数 n,表示数字三角形的层数。接下来 n 行,每行包含若干整数,其中第 i 行表示数字三角形第 i 层包含的整数。输出格式输出一个整数,表示最大的路径数字和。数据范围1≤n≤500,−100原创 2022-02-06 15:51:14 · 621 阅读 · 0 评论 -
AcWing 1015. 摘花生(线性dp 数字三角形模型)
Hello Kitty想摘点花生送给她喜欢的米老鼠。她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。Hello Kitty只能向东或向南走,不能向西或向北走。问Hello Kitty最多能够摘到多少颗花生。输入格式第一行是一个整数T,代表一共有多少组数据。接下来是T组数据。每组数据的第一行是两个整数,分别代表花生苗的行数R和列数 C。每组数据的接下来R行数据,从北原创 2022-02-06 18:42:36 · 290 阅读 · 0 评论 -
AcWing 1018. 最低通行费(线性dp 数字三角形模型)
一个商人穿过一个 N×N 的正方形的网格,去参加一个非常重要的商务活动。他要从网格的左上角进,右下角出。每穿越中间 1 个小方格,都要花费 1 个单位时间。商人必须在 (2N−1) 个单位时间穿越出去。而在经过中间的每个小方格时,都需要缴纳一定的费用。这个商人期望在规定时间内用最少费用穿越出去。请问至少需要多少费用?注意:不能对角穿越各个小方格(即,只能向上下左右四个方向移动且不能离开网格)。输入格式第一行是一个整数,表示正方形的宽度 N。后面 N 行,每行 N 个不大于 100 的正整原创 2022-02-06 20:53:11 · 706 阅读 · 0 评论 -
P1004 [NOIP2000 提高组] 方格取数(三维线性dp 数字三角形模型)
题意:题目给定一个 n × n 的矩阵,矩阵中的每个格子上有一个价值为 w 的物品,给定起点 (1, 1),终点 (n, n),每次规定只能向右或向下走。我们可以从起点出发两次,但同一个格子在两次路径中都经过的话,物品价值只会被累加 1 次。问:两次从 A 到 B,途径格子的物品的总价值最大是多少?本题依旧是由数字三角形 衍生而来。思路:两个路线同时进行如果我们的思路是分两次走:分开两次走(贪心):第一次走到(n, n)求出最大值并记录路径令路径上点收益为0后再走一次。第一次走为局部原创 2022-02-06 22:30:50 · 486 阅读 · 2 评论 -
AcWing 895. 最长上升子序列(线性dp)
给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。输入格式第一行包含整数 N。第二行包含 N 个整数,表示完整序列。输出格式输出一个整数,表示最大长度。数据范围1≤N≤1000,−10 ^ 9≤数列中的数≤10 ^ 9输入样例:73 1 2 1 8 5 6输出样例:4最长上升子序列–LIS问题题意:给我们一条长度为n的数列,从中找到一个长度严格递增的子序列(可以有间隔),并且是最长的那一个,输出长度的最大值。Sample:3 1 2 1 8 5 6中最长原创 2022-02-07 11:52:49 · 930 阅读 · 0 评论 -
AcWing 1017. 怪盗基德的滑翔翼(线性dp 最长上升子序列模型)
怪盗基德是一个充满传奇色彩的怪盗,专门以珠宝为目标的超级盗窃犯。而他最为突出的地方,就是他每次都能逃脱中村警部的重重围堵,而这也很大程度上是多亏了他随身携带的便于操作的滑翔翼。有一天,怪盗基德像往常一样偷走了一颗珍贵的钻石,不料却被柯南小朋友识破了伪装,而他的滑翔翼的动力装置也被柯南踢出的足球破坏了。不得已,怪盗基德只能操作受损的滑翔翼逃脱。假设城市中一共有N幢建筑排成一条线,每幢建筑的高度各不相同。初始时,怪盗基德可以在任何一幢建筑的顶端。他可以选择一个方向逃跑,但是不能中途改变方向(因为中森原创 2022-02-07 12:48:29 · 360 阅读 · 0 评论 -
AcWing 1014. 登山(线性dp 最长上升子序列模型)
题意题目给定一个长度为 n 的数组 a[n],表示某个景点的海拔高度观光队从起点出发,初始海拔高度为 0,先上山后下山,且开始下山后不再往上走目标:找到一个方案,使得观光队浏览到的景点数量最多条件分析:思路依旧是 最长上升子序列 的衍生题。上一题 怪盗基德的滑翔翼 求的是从一个点开始,朝向一个方向求一个最长下降子序列。本题则是让我们求一个先上升后下降的最长子序列,具体如下图所示当然也和上题一样存在 边界情况,即 最优解 答案可能是一个 单调下降子序列 或 单调上升子序列。这种 边界情原创 2022-02-07 16:38:53 · 510 阅读 · 0 评论 -
AcWing 482. 合唱队形(线性dp 最长上升子序列模型)
上一题 AcWing 1014. 登山 的对偶题。由于本题要求至少移除的学生数,因此拿总数减去上一题求得的答案即可。#include <bits/stdc++.h> using namespace std;const int N = 110;int n;int a[N];int f[N], g[N];int main(){ cin >> n; for (int i = 0 ; i < n ; i++) cin >> a[i..原创 2022-02-07 16:45:10 · 125 阅读 · 0 评论 -
AcWing 1012. 友好城市(线性dp 最长上升子序列模型)
Palmia国有一条横贯东西的大河,河有笔直的南北两岸,岸上各有位置各不相同的N个城市。北岸的每个城市有且仅有一个友好城市在南岸,而且不同城市的友好城市不相同。每对友好城市都向政府申请在河上开辟一条直线航道连接两个城市,但是由于河上雾太大,政府决定避免任意两条航道交叉,以避免事故。编程帮助政府做出一些批准和拒绝申请的决定,使得在保证任意两条航线不相交的情况下,被批准的申请尽量多。输入格式第1行,一个整数N,表示城市数。第2行到第n+1行,每行两个整数,中间用1个空格隔开,分别表示南岸和北岸的一对原创 2022-02-07 17:47:17 · 160 阅读 · 0 评论 -
AcWing 1016. 最大上升子序列和(线性dp)
算法:线性dp、LIS下面的分析完全可以类比 LIS状态转移方程:dp[i] = max(dp[i], dp[j] + a[i])(a[j] < a[i],j < i)时间复杂度:O(n^2)状态总个数等于数列总长度N,计算每一个状态需要枚举前i个数,所以总复杂度为O(n^2)#include<bits/stdc++.h>using namespace std;const int N = 1010;int a[N];int dp[N];int n;..原创 2022-02-07 18:39:04 · 358 阅读 · 0 评论 -
AcWing 1010. 拦截导弹(线性dp 最长上升子序列模型 贪心 二分)
某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数,导弹数不超过1000),计算这套系统最多能拦截多少导弹,如果要拦截所有导弹最少要配备多少套这种导弹拦截系统。输入格式共一行,输入导弹依次飞来的高度。输出格式第原创 2022-02-08 00:23:54 · 244 阅读 · 0 评论