动态规划
DeepJay
这个作者很懒,什么都没留下…
展开
-
Educational Codeforces Round 77 (Rated for Div. 2) E. Tournament (DP)
题目:传送门 B站有详解点此跳转 这里只谈一谈,为什么直接贪心就可以了(这里其实是DP的思想) 首先不考虑贿赂的原因,那么这个满二叉树的每一条树链 自底向上能力值一定是单增的,越强的人能pk掉更多的人,所以可以把能力值高的人放在高轮次(便于后面贪心,当然放在前面被朋友pk掉也是可以的)。 对于-1前面的数字完全不必理会,因为朋友可以吊打他们。 那么我们就假定-1是第一个数字。对于朋友来说,第一轮选...原创 2019-11-29 20:51:59 · 185 阅读 · 0 评论 -
Codeforces Round #600 (Div. 2) E. Antenna Coverage (DP)
传送门 思路见注释; AC代码 #include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int,int> pii; typedef pair<LL,LL> pLL; const int N=2e5+5; const double inf=0x3f3f3f3f;...原创 2019-11-21 20:43:16 · 106 阅读 · 0 评论 -
CodeForces - 1249F(树形DP)
思路: 考虑选了一个点u就加上他的权值w[u] ,那么对于与u距离小于K的点v,作w[v]-w[u] ,相当于对v造成选u不选v的影响。如果有的点点权变成了负数,那么这个点一定不会被选。如果有的点点权还是正数且之前被w[u]更新了,那就再加上这个点的权值进行“补差”,就相当于选了这个点而没有选u,而如果没有w[u]被更新,则相当于选了 u、v 两个点 然后就是选点顺序的问题,一种可行的方案就是从叶...原创 2019-11-08 11:22:15 · 245 阅读 · 0 评论 -
Codeforces Round #598 (Div. 3) E - Yet Another Division Into Teams (dp)
传送门 AC代码 /* 先排序,因为取连续的一段数作为一队,diff肯定是优于不连续的 当一段>=6时,一定能分成两队,diff4-diff3可以被优化掉 所以 就有了递推式 dp[i] = min ( dp[i] , dp[i-j] + a[i] - a[i-j+1] ), 3<=j<=5; */ #include<bits/stdc++.h> using nam...原创 2019-11-06 20:52:31 · 252 阅读 · 0 评论 -
POJ 1042(DP+路径打印)
被一个max和一个inline卡常了。。。 dp[i][j]表示前i个湖用时j个单位时间时钓到的最多鱼数。 状态转换方程为:dp[i][j]=Math.max(dp[i-1][ j-k-t[i] ]+fishs , dp[i][j]), t[i]为从第i-1个湖到第i个湖所用的时间,fishs为在k个时间单位内小明在第i个湖钓到的鱼数; 递推填表时,有很多细节要注意,见代码注释 AC代码 #inc...原创 2019-10-23 21:56:20 · 158 阅读 · 0 评论 -
CF1248C Ivan the Fool and the Probability Theory(计数DP+思维)
传送门 思路: 由题意可知:相邻两行要么相同,要么相反; 假设上述命题为假命题, 那么一定存在a[ i ][ j ] != a[ i ][ j+1 ] , a[ i+1 ][ j ] == a[ i+1 ][ j+1 ] ; 由于要么为黑、要么为白(每个格子只有两种状态) 则这四个格子中一定有一个格子有两个相同颜色的相邻格子, 与题目要求矛盾, 因此上述命题为真命题; 得证。 分析一下第一行的情况...原创 2019-10-22 21:46:21 · 230 阅读 · 0 评论 -
Uva481 (LIS+路径打印)
last数组储存在栈中的对应位置 题目要求找最后一个lis,就直接从最后向前遍历 因为后面能够更新栈中元素的元素,下标靠后, 所以不会影响寻找; AC代码 #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; typed...原创 2019-10-15 11:50:37 · 153 阅读 · 0 评论 -
POJ1192 (树形dp 最优连通子集)
AC代码 #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; typedef long long LL; const int N=1e3+5; const int inf=0x3f3f3f3f; const int m...原创 2019-10-15 09:58:27 · 181 阅读 · 0 评论 -
POJ-3162(树形DP+单调队列)
题意:求1~n 在树上的最远距离d[i] , 1<=i<=n; 然后求出d数组里最长区间长度且满足区间最大值-最小值<=m; 思路:树形dp求出数组d; 然后两个单调队列分别维护最小值最大值,并且维护一个最左端点l,更新队列 、端点和答案即可。 AC代码 #include<cstdio> #include<cstring> #include<ccty...原创 2019-10-09 16:28:12 · 172 阅读 · 0 评论 -
最小支配集(poj3659)
最小覆盖集:点覆盖边 最小支配集:点覆盖点 AC代码 #include<cstdio> #include<cstring> #include<cctype> #include<algorithm> using namespace std; typedef long long LL; const int N=1e5+5; const int inf=0...原创 2019-10-05 21:05:00 · 306 阅读 · 0 评论 -
求树的重心 模板
树的重心: 树的重心也叫树的质心。找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。 void dfs(int u,int pre) { num[u]=1; f[u]=0; for(int i=head[u];i;i=e[i].next) { int v=e[i].to; if(v...原创 2019-10-04 20:59:50 · 150 阅读 · 0 评论 -
1234F - Yet Another Substring Reverse(枚举状态压缩+子集DP)
题意: 给出一个只含 a~t 的字符串,现在可以选择一段区间进行翻转,问区间中字符各不相同时,最长长度为多少。 分析: 将题意转换为选择两个字符各不相同的区间,然后长度相加取最大; 字符串中满足条件的所有区间长度和不超过20∗n,那么处理出所有区间,现在任务即为找到两个区间,其字符各不相同,且长度和最大; dp[i] 代表,最多(至多)出现这些字符 的 连续串 的 最大长度 i是二进制状态枚举 ...原创 2019-10-03 11:19:33 · 315 阅读 · 0 评论 -
P2015 二叉苹果树(树形背包,边权)
树形背包(有依赖性的背包) 由底向上更新,把子树处理成一个最优物品集,即像背包九讲说的一样,对于所以费用相等的,我们用01背包跑一个最大的价值,作为一个新的物品集。而向上更新时,每一个容量对于每一个物品集的选取而言,相当于做一次多重背包,选择一个取法,作为最优解,而这些容量对应的最优解集又会作为一个新的最优物品集回溯上去。 AC代码 #include<cctype> #include&...原创 2019-10-02 19:46:39 · 124 阅读 · 0 评论 -
Strategic game(树上最小点集覆盖,树形DP)
不取父亲结点,那么必须取儿子节点,这样才能保证父亲和儿子的连边会被覆盖; 取父亲结点,那么儿子节点可取 可不取; f [ u ] [ 0 ] += f [ v ] [ 1 ] ; f [ u ] [ 1 ] += min( f [ v ] [ 1 ] , f [ v ] [ 0 ] ) ; #include<cctype> #include<cstdio> #include...原创 2019-10-02 20:18:42 · 164 阅读 · 0 评论 -
1221D - Make The Fence Great Again(dp+设置多种状态)
转化:考虑到相邻不相等,dp具有后效性,可以等效为当前高度与前一个不相等,这样就能递推了; 以下转载自 https://www.cnblogs.com/F-Mu/p/11561159.html 题意:对于n个栅栏,对于每个i,有高度a[i],对于任意2<=i<=n,有a[i]!=a[i−1],则称该组栅栏为好栅栏,每个栅栏可花费b[i]提升1个高度(可无限提升)。给一组栅栏,问最少花费...转载 2019-09-22 11:48:47 · 246 阅读 · 0 评论 -
BUY LOW, BUY LOWER, POJ - 1952(LIS+去重计数)
一开始疯狂WA,后来用别人题解代码debug发现 2 1 1 这组数据应该输出1,而我输出0,原来是ans初始化错了。。。。 解析: 我去重的思想是,如果a [ i ] == a [ j ] (j<i) && dp [ i ] == dp [j ] ,那么说明就重复了为了避免之后算重复,(f为计数数组,储存的是长度为dp[ i ]且以a [ i ] 结尾的 对应的不重复序列数...原创 2019-09-21 10:56:54 · 86 阅读 · 0 评论 -
Brackets Sequence POJ - 1141(区间DP,括号匹配)
状态转移方程: i > j , f [ i ] [ j ] = 0 ; (空串不需要补括号) i = j , f [ i ] [ j ] = 1 ; (单个括号需要补一个括号) if s [ i ] match s [ j ] , f [ i ] [ j ] = f [ i + 1 ] [ j - 1 ] ; else f [ i ] [ j ] = min( f [ i ] [ j ] ...原创 2019-09-18 20:37:56 · 131 阅读 · 0 评论 -
POJ - 3280 (区间dp+记忆化搜索)
题意:给定一个字符串S,字符串S的长度为M(M≤2000),字符串S所含有的字符的种类的数量为N(N≤26),然后给定这N种字符Add与Delete的代价,求将S变为回文串的最小代价和。 经典区间dp问题,对于多维dp,递归是一个很好写且好理解的方法。 对于一个字符串s,有左指针 i 和右指针 j。 若s[ i ] == s[ j ] , f[ i ][ j ] = f[ i+1 ][ j-1 ]...原创 2019-09-17 21:11:46 · 148 阅读 · 0 评论 -
Max Sum Plus Plus HDU - 1024(最大M子段和+滚动数组优化)
递推填表,填出来是个平行四边形; #include<cstdio> #include<cctype> #include<cstring> #include<algorithm> using namespace std; typedef long long LL; const int N=1e6+5; const int inf=0x3f3f3f3f;...原创 2019-09-29 17:05:33 · 146 阅读 · 0 评论 -
最大全1子矩阵的两种解法(例题:City Game HDU - 1505)
以前牛客多校遇到过两道,都没做出来,这次来系统性的补习一下。 例题:City Game HDU - 1505 题意:给你一个矩阵,求最大全1子矩阵,最后结果乘以3。。。 全1矩阵可以参考下图 这个框就代表一个全1矩阵,且图中所示是一个极大全1矩阵(四条边都有0) 当然他也是一个最大全1矩阵。 做法一:单调栈+预处理 我们先把 01矩阵预处理,对于第 j 列,从第一行从头开始扫描至最后一行,得到...原创 2019-09-25 21:20:13 · 972 阅读 · 0 评论 -
P2014 选课(树形背包,点权)
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=3e2+5; const int inf=0x3f3f3f3f; #define ls (i<<1) #define rs (i<<1|1) #define fi first #define se seco...原创 2019-10-02 21:57:17 · 118 阅读 · 0 评论 -
P1352 没有上司的舞会(树形DP入门,自底向上更新)
f [ u ] [ 1 ] 表示当前点 取,f [ u ] [ 0 ] 表示当前点 不取 则有状态转移方程: f [ u ] [ 0 ] += max( f [ v ] [ 0 ] ,f [ v ] [ 1 ] ) ,v是u的儿子结点; 【比线性dp多了个子节点求和】 f [ u ] [ 1 ] += f [ v ] [ 0 ]; AC代码 #include<bits/stdc++.h>...原创 2019-10-01 17:31:18 · 144 阅读 · 0 评论