随笔分类 - DP相关
摘要:寻找树上最大权值和的两条不相交的路径。 树形DP题。挺难的,对于我…… 定义三个变量ma[MAXN], t[MAXN], sum[MAXN] 其中,ma[i]代表i子树中,最长的路径和 t[i]代表i子树中,用来维护已有一条路径,而且还有一条链从叶子节点到i,则可以从根节点i向上扩展。如下图,维护红
阅读全文
摘要:最二的一次了~我开始以为是带有贪心的DP,谁知道想错了。后来才想明白,暴力二分+记忆化DP#include #include #include #include #define LL long longusing namespace std;const int INF=(1m) swap(n,m);...
阅读全文
摘要:树分治。对于一棵子树的根节点,至少有一条边与儿子相连的属于重边。对于一条轻边,它的贡献值是两端子树大小的乘积,所以,重边应该是贡献值最大的一边。至于要求所有的点,进行深度优先搜索,因为移动一个点只会影响两个点的两个子树,这个可以维护。在进行DP时,选择计算最大的重边的值,答案就是用所有的边贡献值减去...
阅读全文
摘要:DP题。状态很容易设,dp[u][0]表示u点子树解决,dp[u][1]表示剩一条链,dp[u][2]表示邻边全炸.转移有点难,看代码解释:#include #include #include #include using namespace std;const int MAX=100005;vec...
阅读全文
摘要:枚举所有的最大值盒子里糖果为K的情况,对于位置p,dp[p]为p以前的,第p个操作为抽到不是蓝球里的情况,盒子里最多糖果为k的情况的概率。而到p这个位置,可以有连续最多k-1(因为第k个操作必须为抽到不是蓝球,注意,在第一次操作前桌子上已有一粒糖)个,也可以是0,1,2,3,4....,所以维护这样...
阅读全文
摘要:这题的01背包的特点很容易看出来,但其实发现,这个题讲究加入时候的顺序。于是,用贪心排序,如代码中所示,如果A在B前面造成的分数损失更小,则排在前面。。。其实这个我也是猜的。。#include #include #include #include using namespace std;int dp...
阅读全文
摘要:可以知道,当T较大时,对于LIS,肯定会有很长的一部分是重复的,而这重复的部分,只能是一个block中出现次数最多的数字组成一序列。所以,对于T》1000时,可以直接求出LIS,剩下T-=1000直接求出现次数最多的数字的个数即可。其实可以不用到1000,只需到n即可。#include #inclu...
阅读全文
摘要:树上DP题。其实有点类似于01的问题。方程很容易想到。首先,因为一条链的节点其实都是在树上的,所以很容易想到应该先求一个LCA。然后,当某节点不是链的LCA时,它的转移就是:dp[i]=sum[i],其中,sum[i]是i的子节点的dp[i]的和。如果它是某个点的LCA时,那么它的转移就是dp[i]...
阅读全文
摘要:很明显的树形DP了,设状态dp[i][0],dp[i][1]。枚举子节点放或不放的两种状态。在此学到一种不同于一般处理的方法,题目要求被两灯照亮的边尽量多,反过来即被一灯照亮的尽量少设为e。又需要的灯尽量少设为v。设M是一个很大的数,则M*v+e即是所求。由于M很大,所以主导作用取决于v,只要v不同...
阅读全文
摘要:很明显带有博弈的味道。让A-B最大,由于双方都采用最佳策略,在博弈中有一个要求时,让一方的值尽量大。而且由于是序列,所以很容易想到状态dp[i][j],表示序列从i到j。结合博弈中的思想,表示初始状态i->j情况下,先手能获得的最大分数。后手能获得的就是sum[i][j]-dp[i][j]。接下来枚...
阅读全文
摘要:HDU 1561。这道是树形DP了,所谓依赖背包,就是选A前必须选B,这样的问题。1561很明显是这样的题了。把0点当成ROOT就好,然后选子节点前必须先选根,所以初始化数组每一行为该根点的值。由于多选了0点,所以记得把m++.#include #include #include #include ...
阅读全文
摘要:POJ 1973这道题以前做过的。今儿重做一次。由于每个程序员要么做A,要么做B,可以联想到0/1背包(谢谢N巨)。这样,可以设状态dp[i][j]为i个程序员做j个A项目同时,最多可做多少个B项目。枚举最后一个程序员做多少个A项目进行转移(0/1)。dp[i][j]=max{dp[i-1][k]+...
阅读全文
摘要:多米诺gu牌覆盖问题也是经典的题目了,主要是由1*k的牌覆盖m*n的矩阵之类的。有递推求解的,也有的如下:如POJ 2411,由1*2的小矩形去覆盖m*n的矩形,问有多少种方案。这道题其实只要计算出上下两行之前的可能存在的状态转换,这样就很容易求解了。如下:void dfs(int pre,int ...
阅读全文
摘要:DP.设状态dp[i][j]表示j辆车后还剩余i个人的花费,枚举一个车的座位k,加上剩下人数i,注意i+k不能超过n,就很容易dp了。#include #include #include using namespace std;const int inf=(1n) break; dp[i]...
阅读全文
摘要:真是神奇,G++TLE,C++500MS。。。判环有一个图论知识就是,m>=n时必有环。如果以m的范围建图,会MLE。然后,利用拓扑排序再来判定是否有环,因为有些景点可能是孤立的。同时,在拓扑时就可以DP求最长路了。#include #include #include #include #defin...
阅读全文
摘要:直接DP求组合数即可。#include #include #include #include #define LL __int64using namespace std;LL dp[21][70];void Init(){ memset(dp,0,sizeof(dp)); dp[0][0]=1ll;...
阅读全文
摘要:祼的完全背包问题#include #include #include #include #define LL __int64using namespace std;LL dp[100005];struct Food{ int a,b;}fd[105];int main(){ int n,m; whi...
阅读全文
摘要:#include #include #include #include #define LL __int64using namespace std;const LL MOD=1000000007ll;LL C[500][500];LL Nn[500];LL dp[50][500]; //表示前i个系...
阅读全文
摘要:就是那个O(nlogn)的LIS算法。#include #include using namespace std;int dt[100005],dp[100005],num[100005];int n,d;int bin(int a){ int l=1,r=n; int ans=0; while(l...
阅读全文
摘要:中了一个坑,循环时竟然从该物品的价格和分数开始,中招了,因为就算价格高于钱数,可能分数符合呢????所以要从零开始。#include #include #include #include #include using namespace std;int dp[102][102][102][7];in...
阅读全文

浙公网安备 33010602011771号