zoukankan      html  css  js  c++  java
  • 警卫安排(dp好题)

    警卫安排(guard)
    【题目描述】
    一个重要的基地被分为 n 个连通的区域。出于某种神秘的原因,这些区域以一个区域为核心,呈
    一颗树形分布。
    在每个区域安排警卫所需要的费用是不同的,而每个区域的警卫都可以望见其相邻的区域,只要
    一个区域被一个警卫望见或者是安排有警卫,这个区域就是安全的。你的任务是:在确保所有区域都
    是安全的情况下,找到安排警卫的最小费用。
    【输入格式】
    第一行 n,表示树中结点的数目。
    接下来的 n 行描述了n 个区域的信息,每一行包含的整数依次为:区域的标号i(0<i<=n),在
    区域i 安排警卫的费用k,区域i 的子结点数目m,接下来m 个数为区域i 的子结点编号。

    一开始被样例误导,样例是按照1到n的顺序来给信息的,然后我的输入也默认成这样,结果爆0了。修改过后也只过了2个点。虽然培训时讲过这题,但是不自己写一遍还真是理解不够透彻。。

    F[node][1],F[node][2],F[node][3]分别表示 监控以node为根的树,在node放警卫/node被他的儿子监控(他自己没有警卫)/node被他的父亲监控。

    F[node][1]=sum{F[node.child][3]}+cost[node];

    F[node][2]比较麻烦,首先既然node被儿子管着,那么有限制“至少有一个儿子是放了警卫的”,因此先假设没有这个限制,那么F[node][2]=sum{min{F[node.child][1],F[node.child][2]}},接着枚举哪个儿子一定放了警卫,假设是编号为k的儿子,那么F[node][2]还要减去min{F[k][1],F[k][2]}再加上F[k][1];

    一开始写成F[node][3]=min{F[node][1],F[node][2]};但仔细揣摩这样是不对的。node被父亲管着,不一定要被他的儿子管着,或者他自己有警卫,比如他自己和儿子都没警卫,但是儿子的儿子有警卫也是可行的。所以只要考虑他的儿子被管住的情况,也就是F[node][3]=sum{min{F[node.child][1],F[node.child][2]}},再和F[node][1]比较取最小值。

    此题不易,必须要有清晰的头脑才能把关系理清楚。

    Every day is meaningful, keeping learning!
  • 相关阅读:
    hadoop集群委任和解除节点
    hadoop参数
    HDFS启动及读写过程(读书笔记)
    hadoop QJM高可用原理
    十七、S3C2440裸机—IIC 接口
    十六、S3C2440裸机—UART
    十五、S3C2440裸机—系统时钟和定时器
    十四、s3c2440裸机—中断控制器
    四、NAND Flash
    二、存储管理器--SDRAM
  • 原文地址:https://www.cnblogs.com/vb4896/p/3897449.html
Copyright © 2011-2022 走看看