![](https://img-blog.csdnimg.cn/20190918140213434.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
DP
DP
btc_runes
没什么意思的人!
展开
-
P1441 砝码称重(01背包+枚举子集)
思路: 用010101背包求nnn个数组成不同数的方案数,dp[i]dp[i]dp[i]代表组成能否组成iii,然后用枚举子集求去掉mmm个数的状态集合,来枚举最大方案。 参考代码: /* * @Author: vain * @Date: 2020 * @LastEditTime: 2020-10-07 18:44:42 * @LastEditors: sueRimn * @Description: 学不会 dp 的 fw * @FilePath: \main\demo.cpp */ #inc原创 2020-10-07 20:07:23 · 146 阅读 · 0 评论 -
状压dp:方格取数(1),互不侵犯
方格取数(1): 题意给你N∗NN*NN∗N矩阵,每一个位置有一个非负数吗,我们可以取任意多个数,但这些数不能相邻,问能取的最大数是多少?(0<N<21)(0<N<21)(0<N<21) 思路: 理解炮兵阵地后,这个题就变的十分简单了,我们可以先处理出长度为nnn的合理状态,并求出这个合理状态的累加和,然后初始化第一行dp[1][i]dp[1][i]dp[1][i]代表第一层所有状态的答案,然后就从第二层开始进行状态的枚举即可,特别判断一下stk[j]stk[j]stk[原创 2020-08-20 10:58:40 · 179 阅读 · 0 评论 -
HDU 2859 DP (求最大对称子矩阵)
题意 给一个 N∗NN * NN∗N 的字符串矩阵,求出最大对称子矩阵,对称轴从左下角-->右上角 思路: 参考代码: #include <cstdio> #include <algorithm> #include <iostream> #include <vector> #include <map> #include <queue> #include <set> #include <cstring>原创 2020-07-13 16:20:37 · 453 阅读 · 0 评论 -
区间DP
题目 设有N堆石子排成一排,其编号为1,2,3,…,N1,2,3,…,N1,2,3,…,N。 每堆石子有一定的质量,可以用一个整数来描述,现在要将这N堆石子合并成为一堆。 每次只能合并相邻的两堆,合并的代价为这两堆石子的质量之和,合并后与这两堆石子相邻的石子将和新堆相邻,合并时由于选择的顺序不同,合并的总代价也不相同。 例如有4堆石子分别为 1 3 5 2, 我们可以先合并1、2堆,代价为4,得到4 5 2, 又合并 1,2堆,代价为9,得到9 2 ,再合并得到11,总代价为 4+9+11=244+9+1原创 2020-05-19 17:28:40 · 1029 阅读 · 0 评论 -
牛客:树上子链(模拟树的直径,求最大子树)
传送门: 昨天牛客比赛,最后8分钟左右ac这道题,这题正解应该是树形dp,无奈我树形dp学的不好,最后想到树的直径,树的直径是树的特有性质,虽然我也不太确定,然后就dfs()模拟树的直径,两次dfs(),求得路程中最大权值和,没想到a了,有点小激动 模拟树的直径AC代码: #include<bits/stdc++.h> using namespace std; #define ll...原创 2020-02-23 15:26:23 · 251 阅读 · 0 评论 -
洛谷 P2015 二叉苹果树详解
传送门:二叉苹果树 二叉苹果树是典型的树上依赖性背包,限制条件很严格 这是一个二叉苹果树: 我们用dp[i][j]表示以i为根节点保留j条边,我们可以得到动态转移方程dp[u][i]=max(dp[u][i],dp[u][i-j]+dp[v][j]) ,u表示根节点,v代表子节点,动态转移方程表示,以u节点保留i条边的最大权值=max(以u为节点取i-j条边的最大权值+以v节点取j条边的...原创 2020-02-01 23:56:09 · 485 阅读 · 0 评论 -
经典DP: HDU(1421)搬寝室
题目链接: 题解: 用dp[i][j]代表从i个数中取j对数,首先我们对给定的数排一个序,使取答案的时候,局部最优,因为我们有取或者不取两种状态,所以当不取的时候我们当前状态等于上一个状态,dp[i-1][j],当取的时候,我们上一个状态为dp[i-2][j-1]代表i-2个数取j-1对数加上取的sqr(a[i],a[i-1]) AC代码: #include<cstdio> #in...原创 2020-01-11 17:56:03 · 139 阅读 · 0 评论 -
点分治学习:树的重心(质心)
树的重心定义: 找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心 dfs一遍就可以找到树的重心 void dfs(int u,int fa) { //vis[u]=true, sizx[u]=1; max_part[u]=0; for(int i=head[u]; ~i; i=tr[i].nex) { int ...原创 2020-01-08 21:20:19 · 628 阅读 · 0 评论 -
状压dp入门(洛谷P1879玉米田地)
吐槽: 尼玛:状压dp真的不简单,可能是我二进制以及位运算学的不太好,自己给自己开的专题,三天也没写一道状压dp,这道题还是从洛谷上找到的入门题 传送门:状压dp玉米田地 题解: 首先我们记录每一行的每一个数的状态转为二进制表示 for(int i=1;i<=m;i++) { for(int j=1;j<=n;j++) { scanf("%d",&...原创 2019-12-11 18:49:33 · 189 阅读 · 0 评论 -
p2015 二叉苹果树 树形依赖形背包
传送门:树形依赖性背包 题意: 给一个二叉苹果树,每个树枝上都有w个苹果,现在我们要剪枝,问保留q个树枝,最多有多少个苹果 题解: 很明显这是有依赖性关系的树,我们要剪掉某根树枝,要观察他是否有子叶,如果有,那减掉这以根树枝连带的它的下放也要被剪掉,所以存在依赖性,所以现在我们在树数进行背包即可。动态转移方程:dp[i][j]=max(dp[i][j],dp[i][k],dp[x][j-k]...原创 2019-12-09 17:31:37 · 153 阅读 · 0 评论 -
poj 1463树形dp入门
一道简单的树形dp 动态转移方程:dp[root][1]+=min(dp[id][1],dp[id][0]) dp[root][0]+=dp[root][1] 若根节点放哨兵,则它的孩子节点有两种选择,若不放,呢么他的孩子节点只有一种选择 AC代码: #include<cstdio> #include<algorithm> #include<cstring>...原创 2019-12-06 12:38:14 · 133 阅读 · 0 评论 -
树形dp入门:Anniversary party
Poj 2342 题意: 有n个人,都有一个快乐值,他们去出席一个会议,但如果去的人中有人是直系的上下级关系,则直系下级会不开心,求使一部分人来之后最大的开心值 输入: 第一行输入一个整数n 接下来n行输入每个人的开心值 接下来n-1行输入两个正整数u,v,代表v是u的上级 最后一行输入0 0代表结束输入 题解: 每个人都只有两种状态,去||不去,如果上级去,呢么下级只有一种状态可选,不...原创 2019-12-06 11:44:58 · 166 阅读 · 0 评论