树形DP

合集下载

dp入门

dp入门

dp[j] = max(dp[j], dp[j - c[i]] + v[i]);
}
}
i\j
j=0
i=0
0
j=1 j=2 j=3 j=4 j=5 j=6
0
00000i=10
3
6
9
12 15 18
i=2
0
3
6
10
13 16 20
17
多重背包
有n种物品,每种最多可以取x[i]个,每个物品有大小和价值,问总大小不超过m的情况下能取到最大的 价值是多少 代码如下: for (int i = 1; i <= n; ++i) {
} } 注意此时j一定是倒序产生
16
完全背包
有n种物品,每种最多可以取无数个,每个物品有大小和价值,问总大小不超过m的情况下能取到最大 的价值是多少
01背包中第二维改成正向即可:
for (int i = 1; i <= n; ++i) {
for (int j = c[i]; j <= m; ++j) {
}
10
数字三角形
线性DP解法 for(int i=m-1;i>0;i--) {
for(int j=0;j<=i;j++) { a[i-1][j]+=max(a[i][j],a[i][j+1]);
} }
11
数字三角形
暴力递归搜索解法: int dfs(int i, int j) {
if (i == n) return a[i][j]; return max(dfs(i+1,j), dfs(i+1,j+1)) + a[i][j]; }

树形数位动态规划_黄哲威

树形数位动态规划_黄哲威

花神的数论题
» 用用sum(i)表示数i二二进制表示下1的个数。 » 问sum(1)~sum(n)这n个数的乘积对
1000000007取模的结果。 » n<=10^15
» 这使得NOIp中看似没有单独讨论数位DP的必 要。
» 但事实上这种方方法还是有或多或少的细节,所以 大大家还是把数位DP看成一一类特殊的DP。初学者 一一般比比较难以一一次写对,但好好对拍就没事了了。
WINDY数
» windy定义了了一一种windy数。不不含前导零且相 邻两个数字之差至至少为2的正整数被称为 windy数。 windy想知道,在A和B之间,包括 A和B,总共有多少个windy数?将答案对 1000000007取模。
树形与数位动态规划
2019年年1月月26日日
⻩黄哲威 hzwer
北北京大大学16级计算机科学
第三节目目标
• 一一些树形dp补充
• 数位dp介绍
• 数位dp练习
NOIP2014 联合权值
» 无无向连通图 G 有 n 个点,n-1 条边。点从 1 到 n 依次编 号,编号为 i 的点的权值为 Wi,每条边的⻓长度均为 1。
» 但是这题数据范围有10^9,(sqrt(B)),这里里里取60000左右。然后预处理理出所有 F[k*S], k=1,2,...
» 这样读入入询问后,找到离B最近的一一个k*S,从F[k*S]开始暴暴力力力计算F[B]。 例例如B=60111,那么因为已经算出了了F[60000],暴暴力力力for i=60001 ... 60111 判断每个i是否是windy数即可。
• 在n个点的点权树上选两条不不相交的路路径,使
路路径上的点权和最大大
• n <= 100000

CA一句话题解

CA一句话题解
1543:同JSOI2008最小生成树计数.
1563:四边形不等式推出决策单调,二分决策点.
1568:李超线段树.
1588:权值平衡树.
1798:线段树双标记.但是我是拿LCT写的.
1800:暴力
1821:二分答案+并查集
1853:爆搜
1857:三分套三分.
1875:矩乘优化DP
达式..
2213:DP乱搞一下.附核心代码
for (int i=2;i&lt;=n;++i) ch[i]=getchar(),maxn=max(maxn,ch[i]-&#39;a&#39;);
for (int i=1;i&lt;=n;++i)
{
2222:似乎数据有问题还是什么?面向数据了一波.
2223:主席树
2229:GHTree
2241:暴力枚举答案然后检测,检测时候需要特技,感觉理论复杂度并不对但是过了
2243:链剖或者LCT,我写的链剖
2244:cdq分治做三维偏序的DP,答案实际上可能非常大会爆…但是出题人十分懒惰没管那样的数据,所以double就过了
2151:堆+贪心
2154:莫比乌斯反演,有很多种公式化法,我的好像是比较傻逼的那种..
2157:LCT,随便打标记
2163:直接最小割过了,其实应该转对偶图然后最短路才对.
2186:考察线性的逆元求法.
2190:反演分析一下,最后却发现答案是个跟phi有关的表
1007:半平面交
1008:组合数学,需要高精
1010:斜率优化/四边形不等式推决策单调性

最大独立集

最大独立集

最大独立集最大独立集 1最大独立集 1题目描述某大学有N个职员,编号为1~N。

他们之间有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。

现在有个周年庆宴会,宴会每邀请来一个职员都会增加一定的快乐指数Ri,但是呢,如果某个职员的上司来参加舞会了,那么这个职员就无论如何也不肯来参加舞会了。

所以,请你编程计算,邀请哪些职员可以使快乐指数最大,求最大的快乐指数。

输入格式第一行一个整数N。

(1<=N<=6000)接下来N行,第i+1行表示i号职员的快乐指数Ri。

(-128<=Ri<=127)接下来N-1行,每行输入一对整数L,K。

表示K是L的直接上司。

最后一行输入0 0输出格式输出最大的快乐指数。

输入输出样例输入 #1711111111 32 36 47 44 53 50 0输出 #15方法:树形dp这是典型的最大独立集2。

(这个水问题有这么高大上的雅号)直接树形dp即可。

\(dp[x][0/1]\)表示选/不选第x个点的最大快乐度。

代码:#include<bits/stdc++.h>using namespace std;int dp[10010][2],n,A[10010];vector<int> G[10010];void DFS(int x,int fa){dp[x][1]=A[x];for(int i=0;i<G[x].size();i++){int t=G[x][i];if(t==fa)continue;DFS(t,x);dp[x][0]+=max(dp[t][0],dp[t][1]);dp[x][1]+=dp[t][0];}}int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&A[i]);for(int i=1;i<=n-1;i++){int x,y;scanf("%d %d",&x,&y);G[x].push_back(y);G[y].push_back(x);}DFS(1,0);cout<<max(dp[1][0],dp[1][1]);return 0;}最大独立集 2基环树,也是环套树,简单地讲就是树上在加一条边。

动态规划基础、进阶与优化

动态规划基础、进阶与优化

山东师大附中陈键飞前言自古以来就是NOIP的重要考察内容,在联赛中占的分量大。

对选手能力有一定要求,需要能够熟练地建立动态规划模型。

需要大量做题,初学者不易掌握其思想。

目录基础:基本概念背包问题——一类典型应用 进阶:更多的问题树形DP状态压缩优化:减少状态数目减少状态转移(决策)时间基本概念最长上升子序列状态:f[i]能完全地表示出问题某个或某些本质相同的形态决策:f[i]=min(f[j]+1)状态由哪个状态转移得到阶段:每个i前面的阶段决定后面的阶段,后面的阶段由前面的状态转移得到基本概念石子合并状态f[i,j]决策f[i,j]=min(f[i,k]+f[k+1,j])+w[i,j] 阶段j-i (区间大小)基本概念无后效性后面阶段的状态只受前面阶段的状态的影响 对于任意两个状态,只能单向的进行转移基本概念拓扑图(有向无环图)无后效性f[i]=min(f[j])+1基本概念 非拓扑图(可能有环) 有后效性a →b →c ?b →c →a ?a bc 51111基本概念最优子问题问题最优,只需子问题最优,与到达子问题的路径无关3 5 24 6f(5)最优,只需f(4)最优,与f(4)是怎么到达的无关与路线具体是3 4 6还是2 4 6无关基本概念最优子问题输出1~n中∑(A(i,p[i]))最大的排列f(i)表示用1~n组成的长度为i的序列? 与到达子问题的路径有关!1 4 3 →6 ?4 2 3 →6 ?基本概念无后效性、最优子问题是否能满足与状态的表示,状态的转移,阶段的划分有关背包问题——一类典型应用 给定n个货币,面值各不相同,问能否凑出m元钱f[i,j]表示前i个货币能否凑出j元f[i,j] = f[i-1,j] (不选j)or f[i-1,j-w[i]](选j)背包问题——一类典型应用 给定n种货币,每种无限多个,面值各不相同,问能否凑出m元钱f[i,j]表示前i种货币能否凑出j元f[i,j]=f[i-1,j] or f[i,j-w[i]]背包问题——一类典型应用 给定n种货币,第i种有A i个,面值W i,问能否凑出m 元钱将每种货币i拆成A i个价值为W i的货币O(m∑A i)将每种货币i拆成价值为W i,2W i,4W i,8W i……的货币O(m∑log A i)单调队列O(mn) ,暂时跳过背包问题——一类典型应用 给定n种货币分为k组,每组只能选一个,问能否凑出m元f[i,j,k]表示用前1~i-1组和第i组的前j个能否凑出k元。

acm中dp问题简单入门讲解

acm中dp问题简单入门讲解

ACM暑期集训报告院系:专业:年级:学号:姓名:日期:西南交通大学目录目录.................................................. 错误!未定义书签。

第1章动态计划(dp) ............................ 错误!未定义书签。

简介.................................................... 错误!未定义书签。

教师内容................................................ 错误!未定义书签。

大体dp——背包问题..................................... 错误!未定义书签。

假设干经典dp及常见优化.................................. 错误!未定义书签。

类似题目................................................. 错误!未定义书签。

参考文献........................................... 错误!未定义书签。

附录1 暑期集训心得体会............................. 错误!未定义书签。

第1章动态计划(dp)(题目采纳2号黑体居中,下空1行)简介(题目采纳四号黑体,正文内容采纳小四号字体,倍行距)在解决问题的时候咱们常常碰到这种问题:在多种方式的操作下咱们如何取得一个最优的方式让咱们取得中意的结果。

这时咱们大多人的思想确实是贪婪。

不错贪婪确实是一个不错的算法,第一他简单容易想到,咱们在操作起来也比较容易。

此刻我推荐几道咱们oj上的贪婪算法的题:soj1562药品运输 soj1585 Climbing mountain。

为了引入动归算法我先拿药品运输这道题简单说一下贪婪算法。

例如1:药品运输(题目采纳小四号Times New Roman字体)Description大地震后,某灾区急需一批药品,此刻有N种药品需要运往灾区,而咱们的运输能力有限,此刻仅有M辆运输车用来运输这批药品,已知不同的药品对灾区具有不同的作用(“作用”用一个整数表示其大小),不同的药品需要的运输力(必要的车辆运载力)不同,而不同的车辆也具有不同的运输力。

dp有哪些种类

dp有哪些种类

dp有哪些种类dp有哪些种类⼀、总结⼀句话总结:⼆、dp动态规划分类详解动态规划⼀直是ACM竞赛中的重点,同时⼜是难点,因为该时间效率⾼,代码量少,多元性强,主要考察思维能⼒、建模抽象能⼒、灵活度。

******************************************************************************************动态规划(:Dynamic programming,DP)是⼀种在、和中使⽤的,通过把原问题分解为相对简单的⼦问题的⽅式求解复杂问题的⽅法。

动态规划常常适⽤于有和性质的问题,动态规划⽅法所耗时间往往远少于朴素解法。

动态规划背后的基本思想⾮常简单。

⼤致上,若要解⼀个给定问题,我们需要解其不同部分(即⼦问题),再合并⼦问题的解以得出原问题的解。

通常许多⼦问题⾮常相似,为此动态规划法试图仅仅解决每个⼦问题⼀次,从⽽减少计算量:⼀旦某个给定⼦问题的解已经算出,则将其存储,以便下次需要同⼀个⼦问题解之时直接查表。

这种做法在重复⼦问题的数⽬关于输⼊的规模呈时特别有⽤。

动态规划问题满⾜三⼤重要性质最优⼦结构性质:如果问题的最优解所包含的⼦问题的解也是最优的,我们就称该问题具有最优⼦结构性质(即满⾜最优化原理)。

最优⼦结构性质为动态规划算法解决问题提供了重要线索。

⼦问题重叠性质:⼦问题重叠性质是指在⽤递归算法⾃顶向下对问题进⾏求解时,每次产⽣的⼦问题并不总是新问题,有些⼦问题会被重复计算多次。

动态规划算法正是利⽤了这种⼦问题的重叠性质,对每⼀个⼦问题只计算⼀次,然后将其计算结果保存在⼀个表格中,当再次需要计算已经计算过的⼦问题时,只是在表格中简单地查看⼀下结果,从⽽获得较⾼的效率。

:将各阶段按照⼀定的次序排列好之后,对于某个给定的阶段状态,它以前各阶段的状态⽆法直接影响它未来的决策,⽽只能通过当前的这个状态。

换句话说,每个状态都是过去历史的⼀个完整总结。

NOIP的DP总结之DP类型

NOIP的DP总结之DP类型
代码:
procedure MultiplePack(cost,weight,amount)
if cost*amount>=V
CompletePack(cost,weight)
return
integer k=1
while k<amount
ZeroOnePack(k*cost,k*weight)
amount=amount-k
f[j*v+k]:=b[l]+j*w; //用队列头的值更新f[j*v+k]
end;
end;
end;
writeln(f[m]);
end.
题目:砝码秤重,tyvj1086,zoj2156,poj2392,hdu1085
Poj1014,divide(见dp2)
二维费用背包
就是限制条件多了一个,变成了二维容量,从而状态多了一维而已。
题目:hdu3236,打包(见dpset)poj2184
分组背包
有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
这个问题变成了每组物品有若干种策略:是选择本组的某一件,还是一件都不选。也就是说设f[k][v]表示前k组物品花费费用v能取得的最大权值,则有:f[k][v]
for i:=1 to n do
begin
read(v,w,c); //读入当前物品:v为物品体积、w为物品价值、c为物品可用次数
if m div v<c k:=0 to v-1 do //把所有的体积按除以v的余数划分为0~v-1
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
树形动态规划
广东中山纪念中学 宋新波
例1最大利润
• 【题目描述】 • 政府邀请了你在火车站开饭店,但不允许同时在两个相连 接的火车站开。任意两个火车站有且只有一条路径,每个 火车站最多有50个和它相连接的火车站。 • 告诉你每个火车站的利润,问你可以获得的最大利润为多 少。 • 例如下图是火车站网络:
例2电子眼
• Input • 输入文件第1行包括一个数字N(1<=N<=100000),表示路 口数。接下来N行,第i+1行的第一个数字ki表示有ki条马 路与路口i相连,后面紧跟着ki个数字,表示与路口i直接 相连的路口。 • Output • 输出最少需要安装电子眼的数量。 • Sample Input • 3 • 223 • 213 • 212 • Sample Output • 2 • Source • GDKOI2006第2试第4题
分析
• 题目给出的模型正好是一棵树加上一条边, 所以一定有且仅有一个环 • 去掉环上任意一条边得到树 • DFS找到环上一条边,设连接x和y • 什么情况才能去掉呢? • X一定要选或者y一定要选就可以了 • 从而得到树形DP模型
分析
• f[x]表示在x处安装电子眼的情况下监控以x为根的 子树中所有边所需安装的最少电子眼数 • G[x]表示在x处不安装电子眼的情况下监控以x为根 的子树中所有边所需安装的最少电子眼数 • f[x]:= min(f[y],g[y])+1,其中y是x的儿子 • g[x]:= f[y],其中y是x的儿子 • 以x和y为根分别做一次树形DP • 答案就是min(f[x],f[y]),时间复杂度为O(N)
例3Debug
例3Debug
讨论例3
例4鱼肉炸弹例4鱼肉炸弹来自讨论例4i 1
max(F (Yi), G (Yi)) • G(X)= i 1 • 实现时用DFS去实现,每个点只需求一次,所以 时间复杂度为O(N)
K
例2电子眼
• 沈阳市是一个环境优美、气候宜人的城市。因为 城市的交通并不繁忙,市内的道路网很稀疏。准 确地说,沈阳市有N条马路和N个路口,每条马路 连接两个路口,每两个路口之间最多只有一条马 路。作为一条交通网络,显然每两个路口之间都 是可达的。为了更好地管理沈阳市的交通,市长 决定在一些路口加装电子眼,用来随时监视路面 情况。这些装在路口的电子眼能够监视所有连接 到这个路口的马路。现在市长想知道最少需要在 多少个路口安装电子眼才能监视所有的马路。市 长已经把所有的路口都编上了1~N的号码。 给你沈阳市的地图,你能帮忙吗?
• 最佳投资方案是在1,2,5,6这4个火车站开饭店可以获 得利润为90
• 【输入格式】 • 第一行输入整数N(<=100000),表示有N个火车站,分别用1, 2。。。,N来编号。接下来N行,每行一个整数表示每个站点的利润, 接下来N-1行描述火车站网络,每行两个整数,表示相连接的两个站 点。 • 【输出格式】 • 输出一个整数表示可以获得的最大利润。 • 【样例输入】 • 6 10 • 20 • 25 • 40 • 30 • 30 • 45 • 13 • 34 • 23 • 64 • 【样例输出】 • 90
分析
• 因为N个点,N-1条边,任意两个火车站有且只有 一条路径,所以是一棵树 • 我们用F[X]表示在以X为根的树中开饭店,X一定 要开,所能获得的最大利润,G[X] 表示在以X为 根的树中开饭店,X一定不开,所能获得的最大 利润,我们知道X开,则它的儿子们Y1,…Yk一定 不能开,X不开,它的儿子们可开可不开,于是 得到以下状态转移方程: K • F[X]= G (Yi) (Yi是X的儿子)
相关文档
最新文档