皇宫看守 树形DP

摘要:
对于n(0<j是除k之外的子节点,2,F[i,1]=∑(min(F[j,2]=min)(F[j,F:exit(p);=1tol[x]域(son[x,=1tol[x]dobegink:=1tol[x]doifi<=k+min(F[son[x,=min(F[x,k+F[son[x],=a[x]))=f[x,3]+min(f[son[x,

题意/Description

太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫。 
皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状;某些宫殿间可以互相望见。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。 
可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。 

 

读入/Input

帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少。

 

输出/Output

输入文件中数据表示一棵树,描述如下: 
第1行 n,表示树中结点的数目。 
第2行至第n+1行,每行描述每个宫殿结点信息,依次为:该宫殿结点标号i(0<i<=n),在该宫殿安置侍卫所需的经费k,该边的儿子数m,接下来m个数,分别是这个节点的m个儿子的标号r1,r2,...,rm。
对于一个n(0 < n<=1500)个结点的树,结点标号在1到n之间,且标号不重复。 

 

题解/solution

     题目说的很清楚,用最少的点覆盖所有的点。题目给出的是个树,所以可以用动态规划来解决。
     给出如下定义:
F[i,0]表示i点不放,且以i为根节点的子树(包括i节点)全部被观察到;
F[i,1]表示i点不放,且以i为根节点的子树(可以不包括i节点)全部被观察到;
F[i,2]表示i点放,且以i为根节点的子树全部被观察到;
     转移如下:
1、由F[i,0]定义可知,设j为i的儿子节点,至少要有一个i的儿子节点是放置守卫的,其余的儿子节点可放可不放,但由于根节点i不放,所以其余的儿子节点如果不放的话,必须保证能被观察到,即F[j][0];所以我们需要枚举必须放置的儿子节点,即下:

  F[i,0] = min{∑(min(F[j][0],F[j,2]))+F[k,2]}

其中k为枚举的必放的儿子节点,j为除了k之外的儿子节点


2、由F[i,1]定义可知,i可以被观察到也可以不被观察到,但儿子节点必须都要被观察到,即下:

  F[i,1] =(min(F[j,0],F[j,2])) 

  j是i的儿子节点


3、由F[i,2]定义可知,i点放置了守卫,所以对于每个儿子节点都能被观察到,取F[j,0],F[j,1],F[j,2]最小值即可,即下:
  F[i,2] = min(F[j,0],F[j,1],F[j,2]) j是i的儿子节点

对于叶节点i,F[i,0] = F[i,2] = data[i],F[i,1] = 0;

讲得已经十分详细了,剩下自己解决吧。

 

代码/Code

var
  son:array [0..1501,0..1501] of longint;
  f:array [0..1501,1..3] of longint;
  a,l:array [0..1501] of longint;
  n,x,t:longint;
function min(o,p:longint):longint;
begin
  if o<p then exit(o);
  exit(p);
end;

procedure main(x:longint);
var
  i,j,k:longint;
begin
  if l[x]=0 then
    begin
      f[x,1]:=a[x]; f[x,3]:=a[x];
      f[x,2]:=0;
      exit;
    end;
  for i:=1 to l[x] do
    main(son[x,i]);
  f[x,1]:=maxlongint;
  for i:=1 to l[x] do
    begin
      k:=0;
      for j:=1 to l[x] do
        if i<>j then
          k:=k+min(f[son[x,j],1],f[son[x,j],3]);
      f[x,1]:=min(f[x,1],k+f[son[x,i],3]);
    end;
  f[x,2]:=0;
  for i:=1 to l[x] do
    f[x,2]:=f[x,2]+min(f[son[x,i],1],f[son[x,i],3]);
  f[x,3]:=a[x];
  for i:=1 to l[x] do
    f[x,3]:=f[x,3]+min(f[son[x,i],1],min(f[son[x,i],2],f[son[x,i],3]));
end;

procedure init;
var
  i,j:longint;
  d:array [0..1501] of longint;
begin
  readln(n);
  fillchar(d,sizeof(d),0);
  for i:=1 to n do
    begin
      read(x,a[x],l[x]);
      for j:=1 to l[x] do
        begin
          read(son[x,j]);
          inc(d[son[x,j]]);
        end;
      readln;
    end;
  for i:=1 to n do
    if d[i]=0 then
      begin
        t:=i;
        break;
      end;
end;

begin
  init;
  main(t);
  write(min(f[t,1],f[t,3]));
end.



免责声明:文章转载自《皇宫看守 树形DP》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇软件测试学习随笔(3) 等价类划分之三个输入框JS的继承下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

中文分词系列(一) 双数组Tire树(DART)详解

1 双数组Tire树简介   双数组Tire树是Tire树的升级版,Tire取自英文Retrieval中的一部分,即检索树,又称作字典树或者键树。下面简单介绍一下Tire树。 1.1 Tire树 Trie是一种高效的索引方法,它实际上是一种确定有限自动机(DFA),在树的结构中,每一个结点对应一个DFA状态,每一个从父结点指向子结点(有向)标记的边对应一...

hdoj

模拟题, 枚举 1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 1049 1050 1057 1062 1063 1064 1070 1073 1075 1082 1083 1084 1088 1106 1107 1113...

H.265 视频编码中的 CTU, CU, PU, TU

  H.265将图像划分为“树编码单元(coding tree units, CTU)”,而不是像H.264那样的16×16的宏块。根据不同的编码设置,树编码块的尺寸可以被设置为64×64或有限的32×32或16×16。很多研究都展示出更大的树编码块可以提供更高的压缩效率(同样也需要更高的编码速度)。每个树编码块可以被递归分割,利用四叉树结构,分割为32×...

iMX6UL配置MCP2515模块(SPI转CAN)——基于迅为iTOP-iMX6UL开发板

写在前面   在文章“嵌入式Linux的CAN总线配置——基于迅为iTOP-4412开发板”中我给4412开发板配置了SPI转CAN模块,使用的是不带设备树的内核。在本篇文章中,要使用支持设备树的内核,给iMX6UL开发板配置MCP2515。   打开iMX6UL开发板的串口终端,输入命令ifconfig -a,可以看到CAN0和CAN1两个设备,这是iM...

数据结构 树

红黑树是每个结点都带有颜色属性的二叉查找树,颜色或红色或黑色。   在二叉查找树强制一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求: 性质1. 结点是红色或黑色。   性质2. 根结点是黑色。   性质3. 所有叶子都是黑色。(叶子是NIL结点)  性质4. 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结...