
DP
DP
zijiang.yang
没什么意思的人!
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
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 · 187 阅读 · 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 · 220 阅读 · 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 · 484 阅读 · 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 · 1057 阅读 · 0 评论 -
牛客:树上子链(模拟树的直径,求最大子树)
传送门:昨天牛客比赛,最后8分钟左右ac这道题,这题正解应该是树形dp,无奈我树形dp学的不好,最后想到树的直径,树的直径是树的特有性质,虽然我也不太确定,然后就dfs()模拟树的直径,两次dfs(),求得路程中最大权值和,没想到a了,有点小激动模拟树的直径AC代码:#include<bits/stdc++.h>using namespace std;#define ll...原创 2020-02-23 15:26:23 · 300 阅读 · 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 · 530 阅读 · 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 · 167 阅读 · 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 · 690 阅读 · 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 · 235 阅读 · 0 评论 -
p2015 二叉苹果树 树形依赖形背包
传送门:树形依赖性背包题意:给一个二叉苹果树,每个树枝上都有w个苹果,现在我们要剪枝,问保留q个树枝,最多有多少个苹果题解:很明显这是有依赖性关系的树,我们要剪掉某根树枝,要观察他是否有子叶,如果有,那减掉这以根树枝连带的它的下放也要被剪掉,所以存在依赖性,所以现在我们在树数进行背包即可。动态转移方程:dp[i][j]=max(dp[i][j],dp[i][k],dp[x][j-k]...原创 2019-12-09 17:31:37 · 188 阅读 · 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 · 178 阅读 · 0 评论 -
树形dp入门:Anniversary party
Poj 2342题意:有n个人,都有一个快乐值,他们去出席一个会议,但如果去的人中有人是直系的上下级关系,则直系下级会不开心,求使一部分人来之后最大的开心值输入:第一行输入一个整数n接下来n行输入每个人的开心值接下来n-1行输入两个正整数u,v,代表v是u的上级最后一行输入0 0代表结束输入题解:每个人都只有两种状态,去||不去,如果上级去,呢么下级只有一种状态可选,不...原创 2019-12-06 11:44:58 · 198 阅读 · 0 评论