王朝百科
分享
 
 
 

树形动态规划

王朝百科·作者佚名  2010-06-08  
宽屏版  字体: |||超大  

树形动态规划

树形动态规划,是指当动态规划的各阶段形成一棵树,利用各阶段之间的关系(动态转移方程),从叶节点(边界)开始逐步向上一层的节点(即父节点)进行动态规划,直到动规到根节点,(即原问题),求的问题的最优解.

典型例题:没有上司的晚会等

没有上司的晚会

【问题描述】

有个公司要举行一场晚会。为了让到会的每个人不受他的直接上司约束而能玩得开心,公司领导决定:如果邀请了某个人,那么一定不会再邀请他的直接的上司,但该人的上司的上司,上司的上司的上司……都可以邀请。已知每个人最多有唯一的一个上司。

已知公司的每个人参加晚会都能为晚会增添一些气氛,求一个邀请方案,使气氛值的和最大。

【输入:】

第1行一个整数N(1<=N<=6000)表示公司的人数。

接下来N行每行一个整数。第i行的书表示第i个人的气氛值x(-128<=x<=127)。

接下来每行两个整数L,K。表示第K个人是第L个人的上司。

输入以0 0结束。

【输出】:

一个数,最大的气氛值和。

【样例输入】

7

1

1

1

1

1

1

1

1 3

2 3

6 4

7 4

4 5

3 5

0 0

【样例输出】

5

【分析】

如上例,上司与小兵之间的关系构成一棵树。

5

|

3 4

| |

1 2 6 7

又是求最优解,并且每一个节点的取舍关乎到全局 因此,此题可用树形动态规划

我们可用f[v][0]存储不选编号为V的节点的最优解,f[v][1]存储选编号为V的节点的最优解

#include<iostream>

using namespace std;

int main(){

int n,qf[201],f[201][2],shs[201],xb[201][201],shu[201][201],x,s,maxc,j,k,a,b,l,i;//qf存储每个人的气氛值,shs存储每个人的上司,xb存储没个人的下属,shu存储构成的树

cin>>n;

for(i=0;i<=n;i++){xb[i][0]=0;shs[i]=0;}

for(i=1;i<=n;i++)cin>>qf[i];l=1;k=1;

while(l!=0 || k!=0){

cin>>l>>k;

shs[l]=k;

xb[k][0]++;

xb[k][xb[k][0]]=l;

}

maxc=0;

for(i=1;i<=n;i++)

{

x=i;s=1;

while(shs[x]!=0){x=shs[x];s=s+1;}

shu[s][0]++;

shu[s][shu[s][0]]=i;

if (s>maxc)maxc=s;

}//建树,maxc存储最大层数

for(i=maxc;i>=1;i--)

for(j=1;j<=shu[i][0];j++)

{

if(xb[shu[i][j]][0]==0){

f[shu[i][j]][0]=0;f[shu[i][j]][1]=qf[shu[i][j]];

}

else

{

f[shu[i][j]][0]=0;f[shu[i][j]][1]=qf[shu[i][j]];

for(k=1;k<=xb[shu[i][j]][0];k++){

a=f[xb[shu[i][j]][k]][0];b=f[xb[shu[i][j]][k]][1];

f[shu[i][j]][1]+=a;

if(b>a)a=b;

f[shu[i][j]][0]+=a;

}//动态转移方程

}

}s=0;

for(i=1;i<=shu[1][0];i++){

a=f[shu[1][i]][0];b=f[shu[1][i]][1];

if(a<b)a=b;

s=s+a;

}//从顶头上司那里择优选择

cout<<s<<endl;

system("pause");

return 0;

}

大家看到,树形动态规划基本上可以分为2个部分,一个是建树,另一个就是动态规划,一个好的数据结构,能使你编程非常容易,这也是树形动态规划的难点之一

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如何用java替换看不见的字符比如零宽空格&#8203;十六进制U+200B
 干货   2023-09-10
网页字号不能单数吗,网页字体大小为什么一般都是偶数
 干货   2023-09-06
java.lang.ArrayIndexOutOfBoundsException: 4096
 干货   2023-09-06
Noto Sans CJK SC字体下载地址
 干货   2023-08-30
window.navigator和navigator的区别是什么?
 干货   2023-08-23
js获取referer、useragent、浏览器语言
 干货   2023-08-23
oscache遇到404时会不会缓存?
 干货   2023-08-23
linux下用rm -rf *删除大量文件太慢怎么解决?
 干货   2023-08-08
刀郎新歌破世界纪录!
 娱乐   2023-08-01
js实现放大缩小页面
 干货   2023-07-31
生成式人工智能服务管理暂行办法
 百态   2023-07-31
英语学习:过去完成时The Past Perfect Tense举例说明
 干货   2023-07-31
Mysql常用sql命令语句整理
 干货   2023-07-30
科学家复活了46000年前的虫子
 探索   2023-07-29
英语学习:过去进行时The Past Continuous Tense举例说明
 干货   2023-07-28
meta name="applicable-device"告知页面适合哪种终端设备:PC端、移动端还是自适应
 干货   2023-07-28
只用css如何实现打字机特效?
 百态   2023-07-15
css怎么实现上下滚动
 干货   2023-06-28
canvas怎么画一个三角形?
 干货   2023-06-28
canvas怎么画一个椭圆形?
 干货   2023-06-28
canvas怎么画一个圆形?
 干货   2023-06-28
canvas怎么画一个正方形?
 干货   2023-06-28
中国河南省郑州市金水区蜘蛛爬虫ip大全
 干货   2023-06-22
javascript简易动态时间代码
 干货   2023-06-20
感谢员工的付出和激励的话怎么说?
 干货   2023-06-18
 
>>返回首页<<
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有