博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj3659-pascal
阅读量:4349 次
发布时间:2019-06-07

本文共 1420 字,大约阅读时间需要 4 分钟。

题目描述:

(警卫看守)

给一棵n个结点的树,要求选中最少的结点使得每个结点被自己或直接相联的结点覆盖

树形DP

很明显是一颗树,虽然没有跟结点,但可以随便拎起一个来开始DP

状态表示f[i,0..2];

f[i,0]表示该结点可以被儿子看到的最优解

f[i,1]表示该结点自己放置一个装置来进行覆盖

f[i,2]表示该结点可以被父亲看到的最优解

需要注意的是,f[i,0],f[i,2]都是可以被看到的最优解,而不是说只能被儿子或父亲看到的最优解

 

那么方程即为

f[i,0]:=min(f[soni,0],f[soni,1]);  //不完全

f[i,1]:=min(f[soni,0],f[soni,1],f[soni,2]);

f[i,2]:=min(f[soni,0],f[soni,1]);

其中f[i,0]若全部儿子都取f[soni,0]那就不成立了,所以需要特别处理

 

还有一些细节

1.第23行只能是小于号不能取等号,因为相等的时候归到下一类应该更优

2.叶子结点f[i,0]需要赋成极大值,影响的是f[fatheri,2],即它父亲的2状态,如果不赋初值,

也就是f[fatheri,2]是0的话即表示用覆盖fatheri这个结点,它以及其子树所需最小费用为0,

而这样的话相当于在fatheri的father处放置一个结点使得i也能被覆盖,其实是覆盖不到的

而从DP本身考虑,f[i,0]当i是叶子时这个状态不存在,所以也不应该有

3.输出时取min不能有f[1,2]因为该状态不存在,可能存在类似于第2条的问题

View Code
1 program sky;  2 var  3    x,y,i,n : longint;  4    f       : array[0..10001,0..2] of longint;  5    a       : array[0..10001,0..1000] of longint;  6    v       : array[0..10001] of boolean;  7 function min(qq,ww: longint ):longint;  8 begin  9    if qq>ww then exit(ww) ; exit(qq); 10 end; 11 procedure dp(x       : longint); 12 var 13    i,mini : longint; 14    vv      : boolean; 15 begin 16    vv:=false; mini:=maxlongint>>1; 17    f[x,1]:=1; 18    for i:=1 to a[x,0] do 19       if not v[a[x,i]] then 20       begin 21      v[a[x,i]]:=true; 22      dp(a[x,i]); 23      if f[a[x,i],0]

总结起来,树形dp的定义状态方式一般f[i,xx]都表示以i结点为根的子树的最优解

 

skysun原创,装载请注明出处 http://www.cnblogs.com/skysun

转载于:https://www.cnblogs.com/skysun/archive/2012/03/16/2400758.html

你可能感兴趣的文章
关于UITableView Grouped 头部和尾部的空白留于
查看>>
web.py学习遇到的问题
查看>>
Windows下QT4.8.4编译环境的搭建(转载http://blog.csdn.net/bestgonghuibin/article/details/38933141)...
查看>>
各种光照算法
查看>>
201521123042 《java程序设计》 第八周学习总结
查看>>
python3 “POST data should be bytes or an iterable of bytes...”的解决方法
查看>>
静态方法
查看>>
保护HTTP的安全
查看>>
js 选取子节点时去除非IE浏览器的换行符
查看>>
javascript是一朵奇葩
查看>>
c语言5-1
查看>>
Mycat入门教程
查看>>
关于"无法解析的外部符号"问题的解决
查看>>
【JavaScript】【译】编写高性能JavaScript
查看>>
【随笔】入行必读:互联网行业薪酬等级
查看>>
Android使用开源框架加载图片
查看>>
CLR是怎么加载到内存的?
查看>>
fckeditor
查看>>
backbone.js
查看>>
python类的特殊成员变量
查看>>