![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
||_动态规划_||
CaprYang
这个作者很懒,什么都没留下…
展开
-
“卓见杯”第五届CCPC中国大学生程序设计竞赛河南省赛-网络模拟赛 部分题解
题目链接A Mex Query#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long ll; const int INF = 0x3f3f3f3f;const ll LINF = 0...原创 2019-04-18 21:39:29 · 494 阅读 · 0 评论 -
String painter HDU - 2476 区间dp
题解题目大意,给ab两个串,每次可以花费1代价将某一段改为一同种字符,问将a改为b的最小代价先考虑一个空的串变成b的最小次数,再利用a和b相同的单个位置为0合并区间,枚举区间长度枚举区间起点如果当前区间左右端点相同则次数等于左边少一格或右边少一格的区间次数即d[i][j]=min(d[i][j], d[i + 1][j], d[i][j - 1])如果左侧或者右侧连着两个相同则次数等于左侧...原创 2019-02-17 19:22:44 · 334 阅读 · 0 评论 -
Formula 1 URAL - 1519 插头dp
题解使用插头dp求解 hash表+位运算加快存取速度 分类讨论每个格子的情况 状态太多不想重新写了 具体看代码。。备注很详细我的菜比代码没看懂的可以看某高中大佬blogAC代码#include &amp;lt;stdio.h&amp;gt;#include &amp;lt;unordered_map&amp;gt;#include &amp;lt;bits/stdc++.h&amp;gt;原创 2019-02-03 20:57:14 · 390 阅读 · 0 评论 -
Computer HDU - 2196 树形dp
题解题目大意 给n个点的无向树 按照编号从2开始分别给出他的父节点和路径长度 输出每个点到其它点的最远距离使用树形dp求解 考虑每个点的最远距离分为两种情况 一种是向父节点走一种是向子节点走d[i]表示第一步向子节点走的最远距离 一旦第一步向子节点走则后面的都要向子节点走否则路径会重复p[i]表示第一步向父节点走的最远距离 d[i]使用DFS自底向上求解类似于计算子树大小p[i]使用DF...原创 2019-01-17 00:23:02 · 195 阅读 · 0 评论 -
Roads in the North POJ - 2631 树的直径 BFS | 树形dp
题解题目大意 给你n-1条带权边组成一个n个节点的树 题目没给n接收到文件尾 求这个树的直径 树的直径为树中两个距离最远点的距离方法1 两次BFS第一次任找一点为起点进行BFS得到最远的点p 点p一定为直径上的一个端点第二次以p为起点再次BFS得到最远的点q 并求出pq之间的距离即为树的直径AC代码#include &amp;lt;stdio.h&amp;gt;#include &amp;lt;iostre...原创 2019-01-16 17:06:28 · 156 阅读 · 0 评论 -
Balancing Act POJ - 1655 树形dp 树的重心
题解题目大意 给你一个n的顶点n-1条边的无根树 让你找出树的重心 并求出平衡值树的重心 找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心 平衡值为最大子树节点数量使用树形dp求解 siz[i]表示i的子树的大小 d[i]表示以i为重的平衡值求解过程中任选一点为树根 siz使用DFS回溯求解siz[i] = 1 + ∑siz[子树]在DFS过程中可以同时求出d[...原创 2019-01-16 15:30:03 · 368 阅读 · 0 评论 -
洛谷 P1352 没有上司的舞会 树形dp
题解树形dp求解 d[i][0]表示i没参加以i为根的子树最大快乐值 d[i][1]表示i参加以i为根的子树最大快乐值如果i不参加则可以从所有子节点j参加或者不参加转移来 即 d[i][0] = a[i] + ∑max(d[i][0], d[i][1])如果i参加则不能从子节点j参加的情况转移来 即d[i][1] = a[i] + ∑d[j][0]求d的过程使用dfs遍历 先递归下去回溯时...原创 2019-01-16 15:08:39 · 348 阅读 · 0 评论 -
CCPC-Wannafly Winter Camp Day4 (Div2, onsite) G 置置置换 dp
题解令d[i][j]表示长度为i最后一个位置为j的数量 从2开始枚举位置i和结尾 奇数由i-1的小于j的状态转移 偶数由大于j的状态转移大于j的情况下 如果当前选为j之前也会出现过j的情况 可以把那一部分大于等于j的状态都理解为+1后的状态如d[4][2]由d[3][3]的{2, 1, 3}转移来可以看作是{3, 1, 4} 所以转移包含j使用前缀和数组优化加法直接计算 s[i - 1]...原创 2019-01-26 23:43:34 · 345 阅读 · 0 评论 -
CCPC-Wannafly Winter Camp Day1 (Div2, onsite) I 起起落落 dp
题解题目可以理解为让你统计持续下降的子序列个数 持续下降子序列可以理解为前三个点的值 左&gt;右&gt;中 再往后平移两个位置依旧满足条件的子序列令d[i]表示以i为结尾的子序列个数 遍历每个位置i 记录可以作为中心点的个数k j从i-2遍历之前处理过的答案如果p[j] &lt; p[i]那么他可以作为i的一个中点k++ 如果p[j] &gt; p[i]那么以j为结尾的子序列都可以接上k和...原创 2019-01-25 20:26:53 · 582 阅读 · 0 评论 -
CCPC-Wannafly Winter Camp Day1 (Div2, onsite) E 流流流动 树形dp
题解按照题意将节点之间连线后 每个联通块无环但是整体不一定联通 使用并查集将每个集合都跟0号节点连一根线 建立以0为根的树使用树形dp d[i][0/1]表示以i为根的子树i这个节点1选/0不选的最大收益 DFS从0遍历整棵树回溯后计算d如果不选当前节点x则直接加上子节点y选或者不选 即d[x][0] += max(d[y][0], d[y][1])如果选当前节点x从子节点y转移时候 如果...原创 2019-01-25 17:15:25 · 406 阅读 · 0 评论 -
You Are the One HDU - 4283 区间dp
题解题目大意,一队人排队上台表演,每个人有个值a[i],他第k个上场就会有a[i]*(k-1)的不愉快度,现在有个栈可以调整上台顺序,对于每个人可以选择进栈或者直接上台,在栈中的人可以随时上台,问不愉快度的最小总和区间dp求解,d[i][j]表示区间[i, j]第i个前面没有人的情况下的最小代价,也就是只有区间[i, j]这些人任意安排顺序上场的最小代价对于每个区间考虑将第一个人进栈,等后面...原创 2019-02-17 19:39:56 · 682 阅读 · 0 评论 -
Codeforces Round #538 (Div. 2) D. Flood Fill 区间dp
题解题目大意 给你一个颜色序列 每次可以把一段连续相同的颜色改为其它颜色 问最少多少次操作能把一个序列改成同一个颜色首先考虑,如果初始状态一段连续的颜色相同则可以把他压缩成一个颜色而不影响结果区间dp求解 令d[i][j]表示区间[i, j]范围内变成同一个颜色所需要的最少次数,初始状态的每个颜色肯定为0即d[i][i] = 0枚举区间长度,枚举区间左端点,如果当前区间左右端点颜色相同则可...原创 2019-02-11 21:10:03 · 372 阅读 · 0 评论 -
郑州轻工业大学“CCPC2019-河南省赛”选拔赛(2) 部分题解
题目链接A 火柴棒等式 <暴力>#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long ll; const int INF = 0x3f3f3f3f;const ll L...原创 2019-04-18 21:21:24 · 936 阅读 · 0 评论 -
河南省第十一届ACM大学生程序设计竞赛 部分题解
题目链接A 计划日#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const ll LINF = 0x3f3f3f3f3f3f3f3f;bool leapyear(int y){ ...原创 2019-04-18 19:50:48 · 1026 阅读 · 0 评论 -
河南省第九届ACM程序设计竞赛 部分题解
A 表达式求值 <逆波兰>#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const ll LINF =...原创 2019-04-21 14:14:21 · 1201 阅读 · 0 评论 -
“卓见杯”第五届CCPC中国大学生程序设计竞赛河南省赛 题解
题解使用树状数组查询某个范围内的数值的数量,因为数值比较大需要先进行离散化处理。使用DFS遍历整棵树,当到达某个节点时首先查询区间[a[i]-m, a[i]+m]范围内的数字数量记为last,表示还没到当前子树时已有的数量。将当前节点值加进梳妆数组,因为自身到自身也算。进行递归,回溯后再次查询区间[a[i]-m, a[i]+m]记为now,表示增加了自身子树之后的数量。最后每个点的答案f[...原创 2019-04-13 18:41:12 · 856 阅读 · 2 评论 -
Codeforces Round #553 (Div. 2) 题解
题目链接A. Maxim and Biology取连续一段改为ACTG的最小代价#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long ll;const int INF = 0x3f...原创 2019-04-20 23:12:59 · 1055 阅读 · 2 评论 -
Codeforces Round #552 (Div. 3) 题解
题目链接A. Restoring Three Numbers#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;con...原创 2019-04-20 22:47:58 · 836 阅读 · 2 评论 -
2019西北工业大学程序设计创新实践基地春季选拔赛(重现赛)
A Chino with Geometry <计算几何>懒省事直接贴kuangbin大大的模版了。。最后取整加了个精度损失#include <stdio.h>#include <bits/stdc++.h>#define fst first#define sed secondusing namespace std;typedef long long...原创 2019-04-09 21:24:50 · 312 阅读 · 0 评论 -
有向无环图 CSU - 1804 拓扑排序 dp
题解由于是有向无环图,可以使用拓扑排序+dp求解,令f[i]表示通过不同路径到达i节点的a的和。拓扑排序不断的从入度为0的节点处理,如当前节点为i目标节点为j,每次f[j] += a[i] + f[i]。a[i]表示i到j,由于是不同路径所以每条边都加。f[i]表示之前能到达i而i又能到达j所以之前能到达i的都能到达j,也是每条边都加。最后将每个节点的f[i]和b[i]相乘求和即可。AC...原创 2019-04-04 19:55:26 · 550 阅读 · 0 评论 -
玩具装箱toy HYSBZ - 1010 dp 斜率优化
题解使用dp求解,转移方程f[i] = min(f[i], f[j] + (s[i] - s[j] - l)^2),复杂度O(N^2),使用斜率优化。j1 < j2 < i 在 j2比j1好的前提下 斜率方程f[j2] + (s[i] - s[j2] - l)^2 < f[j1] + (s[i] - s[j1] - l)^2 将j放在左边i和常量放在右边((f[j2] +...原创 2019-03-08 13:47:38 · 539 阅读 · 0 评论 -
Print Article HDU - 3507 dp 斜率优化
题解dp求解,f[i]表示前i项的最小代价,s为前缀和。转移方程f[i] = min(f[i], f[j] + (s[i] - s[j])^2 + M),dp复杂度O(N^2),使用斜率优化。设f[i]转移从j比k好(k < j < i) 得斜率方程f[j] + (s[i] - s[j])^2 + M < f[k] + (s[i] - s[k])^2 + M 约去相同项 ...原创 2019-03-08 13:41:47 · 561 阅读 · 0 评论 -
仓库建设 HYSBZ - 1096 dp 斜率优化 前缀和
题解dp求解,f[i]表示i点作为仓库前面i个点合理分配的最小代价,每次从前面作为仓库的点j进行转移,加上区间[j, i)移动到i的代价。区间[j, i)移动到i的代价使用前缀和求解。s[i] = ∑(j=1->i){ x[j] * p[j] },sp[i] = ∑(j=1->i){ p[j] }cot[j, i] = ∑(k=j+1->i){ p[k] * (x[i] -...原创 2019-03-08 17:00:56 · 594 阅读 · 0 评论 -
土地购买 HYSBZ - 1597 dp 斜率优化
题解dp求解,考虑某个矩形长宽都被另一个完全包含则这个矩形可以不计算代价。将矩形按x降y升排列。转移方程 f[i] = min(f[i], f[j] + x[j + 1] * y[i]) 表示最大x*最大y,复杂度O(N^2),斜率优化。f[i]通过j转移比k转移更优(k &lt; j &lt; i)斜率方程(f[j] - f[k]) / (x[k + 1] - x[j + 1]) &lt...原创 2019-03-08 16:50:55 · 420 阅读 · 0 评论 -
A 小D的剧场 牛客练习赛40 dp
题解题目的意思就是长度为n的序列,每个位置可以选择1~49的数字,但是连续的3个不能出现他不喜欢的三和弦所有排列,问有多少种满足条件的序列。由于n很小使用dp求解,记录当前位置和上一位使用了哪些数字,复杂度O(49^3*n)令d[i][j][k]表示长度为i的序列最后一位为k倒数第二位为j的情况数量,在转移时遍历当前位和前两位所用数值进行转移。转移方程d[l][j][k] = d[l][j...原创 2019-02-18 20:27:03 · 464 阅读 · 0 评论 -
迷路 HYSBZ - 1297 dp 矩阵优化
题解由于所求时间t过大不能采用直接递推的方式,使用矩阵快速幂来加快递推速度复杂度降低为O((n*10)^3logt)令d[code(i, j)]表示i秒前j节点的方案数,最多存储10秒,code为编码函数定义转移矩阵tran,因为每次乘上转移矩阵要将当前时间后推1秒所以tran[code(i, j)][code(i + 1. j)]=1表示每个节点由当前时间转移到下一秒的时间,i表示时间j表...原创 2019-02-17 19:54:13 · 675 阅读 · 0 评论 -
CCPC-Wannafly Winter Camp Day1 (Div2, onsite) B 吃豆豆 dp | 分层BFS
题解将二维平面增加两个维度 一个已经获得的糖豆数量 另一个为当前位置距离下次获得糖豆的剩余时间 进行分层BFSBFS过程中队列节点记录坐标、已获得数量、已用时间 当已用时间%当前位置t[i][j]==0时则获得一个 标记已经走过的不再重复AC代码#include &amp;amp;lt;stdio.h&amp;amp;gt;#include &amp;amp;lt;bits/stdc++.h&amp;amp;gt;usi原创 2019-01-20 18:07:58 · 625 阅读 · 0 评论 -
Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) D. Recovering BST 区间dp
题解题目大意 给你n个升序排列的数值 让你建立二叉排序树要求连线的节点间gcd>1 问是否能建立成功由于是二叉排序树 中序遍历正好是题目所给的升序排列 所以可以划分为若干区间使用区间dp求解l[i][j]表示区间i到j的元素可以作为节点j+1的左子树 r[i][j]表示区间i到j的元素可以作为节点i-1的右子树状态转移时枚举区间中点从i到j 如果当前中点可以将区间划分为i ~ m-1...原创 2019-01-19 19:10:07 · 236 阅读 · 0 评论 -
CCPC-Wannafly Winter Camp Day5 (Div2, onsite) H Nested Tree 树形dp
题解按照题意 将m课树合并为一颗树 题目保证合并后必定为一棵树且端点数量不超过n*m&amp;amp;lt;=1e6 遍历所有节点不会超时使用树形dp d[i]表示以i为根的子树节点数量 使用DFS递归回溯计算d的值 n*m-d[i]表示以d的父节点为根的子节点数量(把树反转过来)则每次把ans加上d[i]*(n*m-d[i])可计算i节点与父节点连接的边对答案的贡献AC代码...原创 2019-01-24 19:37:28 · 327 阅读 · 0 评论 -
FatMouse and Cheese HDU - 1078 dp
题解因为只能通过小的节点走向大的节点 是个有向无环图使用dp求解将节点按照值从小到大排序 d[i][j]表示到达当前节点的最高分数 通过同行或者同列的比自身小的位置转移AC代码#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const in...原创 2018-10-14 23:21:59 · 207 阅读 · 0 评论 -
Treats for the Cows POJ - 3186 dp
题解l[i][j]表示左边取的比右边多的情况下 第i次取了第j个数字r[i][j]表示右边取的别左边多的情况下 第i次取了第j个数字 l和r分开计算防止重复贡献初始化的时候只有l[1][1]和r[1][n]为两侧的值转移 当i和j固定的时候上次要么取相邻的一个或者对面的一个l[i][j] = max(l[i - 1][j - 1], r[i - 1][n - (i - j) + 1]) ...原创 2018-10-14 23:18:49 · 600 阅读 · 0 评论 -
Longest Ordered Subsequence POJ - 2533 dp lis
题解题目已经说明 使用最长上升子序列求解。。AC代码#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;typedef long long ll;const int INF = 0x3f3f3...原创 2018-10-14 23:13:44 · 217 阅读 · 0 评论 -
Help Jimmy POJ - 1661 dp 离散化
题解他在到达平台左端点或者右端点之前都会保持一个状态不变化 所以只需要计算断点值 离散化端点值(我把左端点+1和右端点-1也离散化了更稳妥一些)d[i]表示到达i这个位置的最短时间 p[i]表示到达i这个位置的最低高度 平台按照高度排序 如果高度差不会摔死则从上向下转移d[左端点] = min(d[左端点], d[k] + h[i] - h[j] + k- 左端点) i为转移的平面 j为当前...原创 2018-10-14 23:11:41 · 626 阅读 · 0 评论 -
Common Subsequence POJ - 1458 dp lcs
题解数据量很小 可以N^2使用最长公共子序列直接求解AC代码#include <stdio.h>#include <iostream>#include <string.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int MAXN = 1...原创 2018-10-14 23:03:53 · 421 阅读 · 0 评论 -
Jury Compromise POJ - 1015
题解题目大意 n个人 每个有俩种属性辩护值A和控诉值B 选择m个人要求|SA-SB|最小且SA+AB最大d[i][j]表示选了i个人的辨控差为j的最大辨控和 i遍历0到m-1 j遍历所有可能的辨控差k遍历所有人如果当前状态没有k这个人则d[i + 1][j + Ai - Bi] = max(d[i + 1][j], d[i][j] + Ai + Bi)注意无效状态设定为-1无法转移p可以...原创 2018-10-14 23:02:13 · 365 阅读 · 0 评论 -
FatMouse's Speed HDU - 1160 dp
题解按照第一维降序排序(第一维相同按第二维降序排列防止第一维相同贡献) 在第二维中找最长上升子序列 用p数组记录转移路径方便输出AC代码#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;c...原创 2018-10-14 22:52:42 · 225 阅读 · 0 评论 -
Tickets HDU - 1260 dp
标题d[0][i]表示第i个人没和前面的人一起买票 前i个人的最小时间d[1][i]表示第i个人和前面的人一起买票 前i个人的最小时间第i个人如果选择和前面的人一起则只能通过d[i - 1][0]转移过来如果不和前面的人一起可以选择d[i - 1][0]和d[i - 1][1]取min转移过来AC代码#include <stdio.h>#include <bits/...原创 2018-10-14 00:04:48 · 401 阅读 · 0 评论 -
免费馅饼 HDU - 1176 dp
题解d[i][j]表示i时间在j这个位置能接到的最多的数量 在第0秒除0号位置都为-INF 也就是无效状态d[i][j]从d[i - 1][j], d[i - 1][j - 1], d[i - 1][j + 1]转移过来 注意状态有效性AC代码#include <stdio.h>#include <bits/stdc++.h>using namespace ...原创 2018-10-13 23:53:05 · 280 阅读 · 0 评论 -
Piggy-Bank HDU - 1114 dp 多重背包
题解直接将m减去n得到硬币重量 d[i]表示容量为i的时候最小的价值 使用多重背包dp求解 区别在于每次取minAC代码#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;const int...原创 2018-10-13 23:49:27 · 583 阅读 · 0 评论 -
Super Jumping! Jumping! Jumping! HDU - 1087
题解题目大意 要求找到一个上升的子序列(不连续) 要求和最大d[i]表示以当前位置的数字为结尾的最大值 每次取小于i中的最大值加上当前数字 n很小N^2计算即可AC代码#include <stdio.h>#include <bits/stdc++.h>using namespace std;typedef long long ll;const int IN...原创 2018-10-13 23:43:25 · 353 阅读 · 0 评论