Knight
KNIGHT
C++博客
首页
新随笔
联系
聚合
管理
posts - 74, comments - 33, trackbacks - 0
浅谈树状双重dp
以前做树状dp的时候就知道
Apple Tree
,可是感觉上有点困难就一直搁浅,昨天刷浙大月赛的Tree of Tree骤然想明白了这个dp过程中的背包。
明显Apple Tree要难一些。。。。今天停了一天的电没有时间调试代码,刚才终于AC,貌似时间上还可以
57
5100258(2)
xujiaming
568K
63MS
C++
1315B
2009-05-05 20:39:29
建议先做一做
Tree of Tree
,其实两道题的代码相似,我的dp函数
void
DFS(
int
x)
{
int
i,j;
dp[x][
1
]
=
DP[x][
1
]
=
arr[x];
for
(i
=
0
;i
<
v[x].size();i
++
)
{
int
t
=
v[x][i];
if
(
!
mark[t])
{
mark[t]
=
true
;DFS(t);
for
(j
=
1
;j
<=
k;j
++
)
{
TMP[j]
=
DP[x][j];
tmp[j]
=
dp[x][j];
}
for
(j
=
1
;j
<=
k;j
++
)
for
(
int
l
=
1
;l
<=
k;l
++
)
{
if
(dp[t][j]
!=-
1
&&
TMP[l]
!=-
1
)dp[x][l
+
j]
=
getmax(dp[x][l
+
j],dp[t][j]
+
TMP[l]);
if
(DP[t][j]
!=-
1
&&
TMP[l]
!=-
1
)DP[x][l
+
j
+
1
]
=
getmax(DP[x][l
+
j
+
1
],DP[t][j]
+
TMP[l]);
if
(DP[t][j]
!=-
1
&&
tmp[l]
!=-
1
)dp[x][l
+
j
+
1
]
=
getmax(dp[x][l
+
j
+
1
],DP[t][j]
+
tmp[l]);
}
}
}
return
;
}
配合代码解释一下:
1.按给定的树取一个节点做为root开始DFS,而这个节点的每一个子树的dp状态完全可以根据背包的思想转移到这个这个root跟新的时候用tmp存储一下状态,防止此次根据子树跟新影响现在的dp状态,而dp过程中要有两种dp状态一种是可以回到root,一种是不可以回到root,即(DP,dp)
posted on 2009-05-05 20:50
KNIGHT
阅读(173)
评论(0)
编辑
收藏
引用
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
<
2009年6月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
常用链接
我的随笔
我的评论
我参与的随笔
留言簿
(8)
给我留言
查看公开留言
查看私人留言
随笔档案
2009年6月 (4)
2009年5月 (14)
2009年4月 (12)
2009年3月 (10)
2009年2月 (12)
2009年1月 (10)
2008年12月 (12)
文章档案
2009年3月 (1)
Friends
OJ
HEU
PKU
ZJU
搜索
最新评论
1. re: (转载)TopCoder入门手册
好,学习了
--wuyiqi
2. re: Knights
评论内容较长,点击标题查看
--Lightning
3. re: Knights
请问您说的奇偶性不同的x,y是指什么?
--Lightning
4. re: [ZZ]后缀数组[未登录]
@爱上对方
请你仔细阅读标题
【ZZ】转载。。懂
--Knight
5. re: [ZZ]后缀数组
请你不要抄
--爱上对方
阅读排行榜
1. (转载)TopCoder入门手册(6445)
2. 浅谈2—SAT问题(6120)
3. 分而治之算法---距离最近的点对 (2707)
4. poj 3648 Wedding(1283)
5. 最小树形图(1281)
评论排行榜
1. poj 3648 Wedding(3)
2. Making the Grade(3)
3. [ZZ]后缀数组(2)
4. 感(2)
5. Knights(2)