
动态规划
文章平均质量分 59
sunday_soft
毕业于东北大学,做教师和软件开发工作
展开
-
动态规划城市最短路径问题
最短路径问题(Shortestpathproblem)再不回退的前提下,找到A到F的最短路径。原创 2022-07-24 09:53:35 · 1279 阅读 · 0 评论 -
开车旅行NOIP2002原题
原创 2020-12-03 16:50:03 · 132 阅读 · 0 评论 -
开车旅行NOIP2012(倍增优化)
题目描述小 A 和小 B 决定利用假期外出旅行,他们将想去的城市从 1 到 N 编号,且编号较小的城市在编号较大的城市的西边,已知各个城市的海拔高度互不相同,记城市 i 的海拔高度为Hi,城市 i 和城市 j 之间的距离 d[i,j]恰好是这两个城市海拔高度之差的绝对值,即d[i,j] = |Hi− Hj|。旅行过程中,小 A 和小 B 轮流开车,第一天小 A 开车,之后每天轮换一次。他们计划选择一个城市 S 作为起点,一直向东行驶,并且最多行驶 X 公里就结束旅行。小 A 和小 B的驾驶风格不同,小原创 2020-09-26 09:48:50 · 342 阅读 · 0 评论 -
Genius ACM CH0601(倍增优化)
题意:给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下:从集合 S 中取出 M 对数(即 2∗M 个数,不能重复使用集合中的数,如果 S 中的整 数不够 M 对,则取到不能取为止),使得“每对数的差的平方”之和最大,这个最大值就称为集合 S 的“校验值”。现在给定一个长度为 N 的数列 A 以及一个整数 T。我们要把 A 分成若干段,使得 每一段的“校验值”都不超过 T。求最少需要分成几段。输入格式:第一行输入整数 K,代表有 K 组测试数据。对于每组测试数据,第一行包含三个整数原创 2020-08-01 10:53:44 · 339 阅读 · 0 评论 -
倍增优化
倍增,字面意思就是“成倍增长”。这是指我们在进行递推时,如果状态空间很大,通常的线性递推无法满足时间与空间复杂度的要求,那么我们可以通过成倍增长的方式.只递推状态空间中在2的整数次幂位置上的值作为代表。当需要其他位置上的值时,我们通过“任意整数可以表示成若干个2的次幂项的和”这一性质,使用之前求出的代表值拼成所需的值。所以使用倍增算法也要求我们递推的问题的状态空间关于2的次幂具有可划分性。“倍增”与“二进制划分”两个思想互相结合,降低了求解很多问题的时间与空间复杂度。我们之前学习的快速幂其实就是“倍增”原创 2020-08-01 09:29:07 · 530 阅读 · 0 评论 -
炮兵阵地图文详解NOI2001/POJ1185(状态压缩)
题目描述司令部的将军们打算在NM的网格地图上部署他们的炮兵部队。一个NM的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区域:沿横向左右各两格,沿纵向上下各两格。图上其它白色网格均攻击不到。从图上可见炮兵的攻击范围不受地形的影响。 现在,将军们原创 2020-06-21 10:41:50 · 1469 阅读 · 0 评论 -
Mondriaan s Dream POJ2411图文详解(状态压缩DP)
在以前我们学习的“线性DP”中,我们提到,动态规划的过程是随着“阶段”的增长,在每个状态维度上不断扩展的。在任意时刻,已经求出最优解的状态与尚未求出最优解的状态在各维度上的分界点组成了DP扩展的“轮廓”。对于某些问题,我们需要在动态规划的“状态”中记录一个集合,保存这个“轮廓”的详细信息,以便进行状态转移。若集合大小不超过N,集合中每个元素都是小于K的自然数,则我们可以把这个集合看作一个N位K进制数,以一个[0,KN-1]之间的的十进制整数的形式作为DP状态的一维。这种把集合转化为整数记录在DP状态中的一类原创 2020-06-19 16:00:36 · 353 阅读 · 1 评论 -
Accumulation Degree POJ 3585(树形DP 二次扫描与换根法)
【例题】Accumulation Degree POJ 3585有一个树形的水系,由N-1条河道和N个交叉点组成。我们可以把交叉点看作树中的节点,编号为1~N,河道则看作树中的无向边。每条河道都有一个容量,连x与y河道的容量记为c(x,y)。河道中单位时间流过的水量不能超过河道的容量。有一个节点是整个水系的发源地,可以源源不断地流出水,我们称之为源点。除了源点之外,树中所有度数为1的节点都是入海口,可以吸收无限多的水,我们称之为汇点。也就是说,水系中的水从源点出发,沿着每条河道,最终流向各个汇点。在整个原创 2020-06-19 12:35:47 · 383 阅读 · 0 评论 -
分组背包
分组背包问题的模型如下:仍然先考虑原始线性DP的做法。为了满足“每组至多选择一个物品”,很自然的想法就是利用“阶段”线性增长的特征,把“物品组数”作为DP的“阶段”,只要使用了一个第i组的物品,就从第i个阶段的状态转移到第i+1个阶段的状态。设F[i , j]表示从前i组中选出总体积为j的物品放入背包,物品的最大价值和。代码片段:memset(f, 0xcf, sizeof(f));f[0] = 0;for (int i = 1; i <= n; i++) for (int j原创 2020-06-18 16:01:09 · 208 阅读 · 0 评论 -
选课 CH5402(背包类树形DP)
题目:学校实行学分制。每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分。学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的。学生选修了这M门课并考核通过就能获得相应的学分。在选修课程中,有些课程可以直接选修,有些课程需要一定的基础知识,必须在选了其它的一些课程的基础上才能选修。例如《Frontpage》必须在选修了《Windows操作基础》之后才能选修。我们称《Windows操作基础》是《Frontpage》的先修课。每门课的直接先修课最多只有一门。两门课也可能存原创 2020-06-18 15:26:13 · 268 阅读 · 0 评论 -
动态规划图文详解
动态规划详解动态规划算法(Dynamic Programming,简称 DP)似乎是一种很高深莫测的算法,你会在一些面试或算法书籍的高级技巧部分看到相关内容,什么状态转移方程,重叠子问题,最优子结构等高大上的词汇也可能让你望而却步。而且,当你去看用动态规划解决某个问题的代码时,你会觉得这样解决问题竟然如此巧妙,但却难以理解,你可能惊讶于人家是怎么想到这种解法的。实际上,动态规划是一种常见的「算法设计技巧」,并没有什么高深莫测,至于各种高大上的术语,那是吓唬别人用的,只要你亲自体验几把,这些名词的含义其原创 2020-06-18 11:41:28 · 3353 阅读 · 2 评论 -
没有上司的舞会 CH5401(树形DP)
题目:Ural大学有N名职员,编号为1~N。他们的关系就像一棵以校长为根的树,父节点就是子节点的直接上司。每个职员有一个快乐指数,用整数 Hi 给出,其中 1≤i≤N。现在要召开一场周年庆宴会,不过,没有职员愿意和直接上司一起参会。在满足这个条件的前提下,主办方希望邀请一部分职员参会,使得所有参会职员的快乐指数总和最大,求这个最大值。输入格式第一行一个整数N。接下来N行,第 i 行表示 i 号职员的快乐指数Hi。接下来N-1行,每行输入一对整数L, K,表示K是L的直接上司。最后一行输入原创 2020-06-18 11:09:59 · 167 阅读 · 0 评论 -
环路运输(环形结构上的动规并单调队列优化)
题目:在一条环形公路旁均匀地分布着N座仓库,编号为1~N,编号为 i 的仓库与编号为 j 的仓库之间的距离定义为 dist(i,j)=min(|i-j|,N-|i-j|),也就是逆时针或顺时针从 i 到 j 中较近的一种。每座仓库都存有货物,其中编号为 i 的仓库库存量为 Ai。在 i 和 j 两座仓库之间运送货物需要的代价为 Ai+Aj+dist(i,j)。求在哪两座仓库之间运送货物需要的代...原创 2020-05-08 14:46:06 · 602 阅读 · 0 评论 -
环形结构上的石子合并
题目:在一个圆形操场的四周摆放 N 堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一堆的石子数,记为该次合并的得分。试设计出一个算法,计算出将 N堆石子合并成 1堆的最大得分。输入格式数据的第 1行是正整数 N,表示有 N 堆石子。第 2行有 N 个整数,第 i 个整数 ai 表示第 i 堆石子的个数。输出格式1 行为最大得分输入样例7...原创 2020-05-08 14:18:20 · 193 阅读 · 0 评论 -
石子合并NOI1995--区间DP
题目:在一个操场上一排地摆放着N堆石子。现要将石子有次序的合并成一堆。规定每次只选相邻的2堆石子合成新的一堆,并将新的一堆石子数记为该次合并的得分。编程任务:设计一个程序,计算出将N堆石子合并成一堆的最小得分。1≤N≤100,0≤ai≤200。扩展题目:环形结构上的动态规划问题在一个圆形操场的四周摆放 N 堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并...原创 2020-05-08 09:47:51 · 288 阅读 · 0 评论 -
单调队列优化多重背包详解
多重背包基本模型如下:给定N种物品,其中第i种物品的体积为Vi,价值为Wi,并且有Ci个。有一容积为M的背包,要求选择若干个物品放入背包,使得物品总体积不超过M的前提下,物品价值总和最大。输入格式第一行两个整数,N,M,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 Vi,Wi,Ci,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表...原创 2020-04-20 11:05:22 · 2169 阅读 · 1 评论 -
多重背包(二进制拆分优化)
多重背包基本模型如下:给定N种物品,其中第i种物品的体积为Vi,价值为Wi,并且有Ci个。有一容积为M的背包,要求选择若干个物品放入背包,使得物品总体积不超过M的前提下,物品价值总和最大。输入格式第一行两个整数,N,M,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 Vi,Wi,Ci,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表...原创 2020-04-16 16:09:01 · 291 阅读 · 0 评论 -
多重背包基本模型
多重背包基本模型如下:给定N种物品,其中第i种物品的体积为Vi,价值为Wi,并且有Ci个。有一容积为M的背包,要求选择若干个物品放入背包,使得物品总体积不超过M的前提下,物品价值总和最大。输入格式第一行两个整数,N,M,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 Vi,Wi,Ci,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表...原创 2020-04-16 11:47:39 · 480 阅读 · 0 评论 -
Jury Compromise POJ1015(多个“体积维度”的0/1背包)
题目:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定。陪审团是由法官从公众中挑选的。法官先随机挑选n 个人作为陪审团的候选人,然后再从这n 个人中选m 人组成陪审团。选m 人的办法是:参与诉讼的控方和辩方会根据对候选人的喜欢程度,给所有候选人打分,分值从0 到20。第i个人的得分分别记为a[i],b[i]。为了公平起见,法官选出陪审团的原则是:选出的m 个人必须满足:辩方总分D和控方...原创 2020-04-09 08:55:12 · 181 阅读 · 0 评论 -
自然数拆分 Lunatic版 TYVJ1172(完全背包)
题目:输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。输入格式:输入只有一个整数n,表示待拆分的自然数n。 1<=n<=4000输出格式:输出一个数,即所有方案数因为这个数可能非常大,所以你只要输出这个数 mod 2147483648 的余数即可。输入样例7输出样例14思路:这是一个典型的完全背包模型,1~N个自然数构成N中物品,每种...原创 2020-03-27 11:09:19 · 187 阅读 · 0 评论 -
完全背包模型
完全背包的模型如下:给定N个物品,其中第i个物品的体积Vi,价值为Wi,并且有无数个。有一容积为M的背包,要求选择一些物品放入背包,使得物品总体积不超过M的前提下,物品的价值总和最大。输入样例:10 42 13 34 57 9输出样例12使用传统的二维线性DP做法:F[i,j]表示从前i中物品中选出了总体积为j的物品放入背包,物品的最大价值和。只要拿一个物品,一种情况是不...原创 2020-03-27 10:59:44 · 256 阅读 · 0 评论 -
0/1背包
0/1背包问题的模型如下:给定N个物品,其中第i个物品的体积Vi,价值为Wi。有一容积为M的背包,要求选择一些物品放入背包,使得物品总体积不超过M的前提下,物品的价值总和最大。输入样例:10 42 13 34 57 9输出样例12算法思路:依次考虑每个物品是否放入背包,用“已处理的物品数”作为DP阶段,以“背包中已放入的物品总体积”作为附加维度。F[i,j]表示从前i个物品...原创 2020-03-27 09:53:59 · 279 阅读 · 0 评论 -
Cookies CH5105(线性DP+贪心)
题目:有M个饼干,准备全部分给N个孩子。每个孩子有一个贪婪度,第 i 个孩子的贪婪度为 g[i]。如果有 a[i] 个孩子拿到的饼干数比第 i 个孩子多,那么第 i 个孩子会产生 g[i]*a[i]的怨气。每个孩子至少分到一块饼干,并且所有孩子的怨气总和最小。输入格式:第一行两个整数表示N 个孩子,M块饼干。第二行到第N+1行每个孩子的贪婪度。输出格式:第一行最小怨气值。第二行分配方...原创 2020-03-26 13:33:13 · 263 阅读 · 0 评论 -
I-country
Title在 N* M 的矩阵中,每个格子有一个权值,要求寻找一个包含 K 个格子的凸连通块(连通块中间没有空缺,并且轮廓是凸的,如书中图片所示),使这个连通块中的格子的权值和最大。求出这个最大的权值和,并给出连通块的具体方案。N,M≤15,K≤225。输入格式On the first line of input there are 3 integer numbers N,M,K (1<...原创 2020-03-23 10:21:03 · 242 阅读 · 0 评论 -
传纸条 NOIP2008(线性DP)
题干:小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题。一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了。幸运的是,他们可以通过传纸条来进行交流。纸条要经由许多同学传到对方手里,小渊坐在矩阵的左上角,坐标(1,1),小轩坐在矩阵的右下角,坐标(m,n)。从小渊传到小轩的纸条只可以向下或者向右传递,从小轩传给小渊的纸...原创 2020-03-22 20:07:59 · 227 阅读 · 0 评论 -
Mobile Service TYVJ1061(线性DP)
题意:一个公司有三个移动服务员,开始三个服务员分别在位置1,2,3。如果某个位置(用一个整数表示)有一个请求,某个员工必须赶到那个地方去(那个地方没有其他员工),某一时刻只有一个员工能移动。被请求后,他才能移动,不允许在同样的位置出现两个员工。从p到q移动一个员工,需要花费c(p,q),c(p,p)=0。公司必须满足所有的请求。目标是最小化公司花费。输入格式:第一行有两个整数L,N(3<...原创 2020-03-21 18:23:04 · 210 阅读 · 0 评论 -
Making the Grade POJ3666(线性DP)
问题描述:给定长度为N的序列A,构造一个长度为N的序列B,满足:1、B非严格单调,即B1<=B2<=B3<=…<=Bn或 B1>=B2>=B3>=…Bn。2、最小化只需要求出这个最小值S。1<=N<=2000,1<=|Ai|<=109。InputLine 1: A single integer: NLines 2…N...原创 2020-03-20 16:02:27 · 370 阅读 · 0 评论 -
LCIS(最长公共上升子序列)
问题:字符串a,字符串b,求a和b的LCIS(最长公共上升子序列)。这道题目是LIS与LCS的综合。没有LIS和LCS知识,参考下面博文:LIS(最长上升子序列)LIS最长上升子序列详解(动态规划、贪心+二分、树状数组)LCS(最长公共子序列)用F[i,j]表示A1 ~ Ai与B1 ~ Bj可以构成的以Bj为结尾的LCIS的长度。假设A0=B0=- ∞当Ai≠Bj时,有F[i,j]=...原创 2020-03-18 22:35:09 · 601 阅读 · 0 评论 -
LCS(最长公共子序列)
问题描述:最长公共子序列问题(Longest Common Subsequence problem):给定两个序列X = <x1,x2,…,xm>和Y = <y1,y2,…,yn>,求X和Y长度最长的公共子序列。状态表示:F[i,j]表示前缀子串A[1 ~ i]与B[1 ~ j]的“最长公共子序列”的长度。阶段划分:已处理的前缀长度(两个字符串中的位置,即一个二维坐...原创 2020-03-18 09:55:58 · 246 阅读 · 0 评论 -
LIS最长上升子序列详解(动态规划、贪心+二分、树状数组)
1.摘要:关于LIS部分,本篇博客讲一下LIS的概念定义和理解,以及求LIS的三种方法,分别是O(n^2)的DP,O(nlogn)的二分+贪心法,以及O(nlogn)的树状数组优化的DP,最后附上几道非常经典的LIS的例题及分析。2.LIS的定义:最长上升子序列(Longest Increasing Subsequence),简称LIS,也有些情况求的是最长非降序子序列,二者区别就是序列中...原创 2020-03-18 09:11:58 · 2879 阅读 · 1 评论 -
LIS(最长上升子序列)
问题描述:给定一个长度为N的数列A,求数值单调递增的子序列的长度最长是多少。A的任意子序列B可表示为B={Ak1,Ak2,Ak3,…,Akp},其中k1<k2<k3<…<kp。状态表示:F[i]表示以A[i]为结尾的“最长上升子序列”的长度。阶段划分:子序列的结尾位置(也就是数列A的位置,从前到后)转移方程:边界:F[i]=0最终目标完整代码:#inc...原创 2020-03-18 08:41:39 · 161 阅读 · 0 评论