• 警卫安排(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!
  • 相关阅读:
    [PyTorch]PyTorch中反卷积的用法
    [Pytorch]PyTorch Dataloader自定义数据读取
    [ACM]51nod 贪心专题
    上采样和PixelShuffle(转)
    反卷积(转置卷积)的理解
    [PyTorch]PyTorch中模型的参数初始化的几种方法(转)
    [OpenCV]OpenCV常用语法函数与坑点
    [PyTorch]PyTorch/python常用语法/常见坑点
    [Pytorch]PyTorch使用tensorboardX(转
    [Pytorch]Pytorch 保存模型与加载模型(转)
  • 原文地址:https://www.cnblogs.com/vb4896/p/3897449.html
Copyright © 2020-2023  润新知