小胖守皇宫(VIJOS P1144 )题解

题目描述

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

输入格式

输入文件中数据表示一棵树,描述如下:

第1行 nn,表示树中结点的数目。

第2行至第n+1n+1行,每行描述每个宫殿结点信息,依次为:该宫殿结点标号i(0<i≤n)i(0<i≤n),在该宫殿安置侍卫所需的经费kk,该边的儿子数mm,接下来mm个数,分别是这个节点的mm个儿子的标号r1,r2,...,rmr1,r2,...,rm。

对于一个n(0<n≤1500)n(0<n≤1500)个结点的树,结点标号在1到nn之间,且标号不重复。

输出格式

输出文件仅包含一个数,为所求的最少的经费。



由于宫殿节点图是树的形状,所以很明显这是树形DP。

首先二维状态,dp[i][j],j∈{1,2,3}

dp[i][1]表示这个点被自己守卫。

dp[i][2]表示这个点被父亲守卫。

dp[i][3]表示这个点被儿子守卫。

根据属性DP惯用套路,首先大法师(DFS)搜索到叶节点,然后向上更新。

如果这个点被自己守卫,那么他的儿子可能有三种状态,既可能是自己守卫,又可能被父亲守卫,还有可能被它的儿子守卫。

用s来代表x的儿子,所以:

dp[x][1] += min(dp[s][2],min(dp[s][3],dp[s][1]));

如果这个点被父亲守卫,那么他的儿子只可能被自己守卫,或者被它的儿子守卫。

dp[x][2] += min(dp[s][1],dp[s][3]);

那么最困难的是这个点被自己的儿子守卫,那么他的所有儿子同样是两种状态,被自己守卫或者被它的儿子守卫。且一定存在一个儿子被自己守卫。

如果更新了一圈后,发现所有的儿子自己守卫的代价都要大于它们的儿子守卫它们的价值(即x的儿子s守卫的价值大于s的儿子守卫的价值),我们需要加上一个s自己守卫和s的儿子守卫的差量,并且保证这个差量最小。

注意把所有点自己守卫自己的情况先赋上值。

代码:

#include<cstdio>
#include<algorithm>
#define N 1555
using namespace std;
int money[N];
int son[N][N];
int dp[N][4];
void dfs(int x)
{
    if(!son[x][0])
    {
        dp[x][1] = money[x];
        dp[x][3] = money[x];
        dp[x][2] = 0;
        return ;
    }else
    {
        for(int i = 1;i<=son[x][0];i++)
        {
            dfs(son[x][i]);
        }
        for(int i = 1;i<=son[x][0];i++)
        {
            int s = son[x][i];
            dp[x][1] += min(dp[s][2],min(dp[s][3],dp[s][1]));//自己
            dp[x][2] += min(dp[s][1],dp[s][3]);//父亲
        }
        bool flag = 0;
        int bu = 2147438647;
        for(int i = 1;i<=son[x][0];i++)
        {
            int s = son[x][i];
            dp[x][3] += min(dp[s][1],dp[s][3]);
            if(dp[s][3]>=dp[s][1])
            {
                flag = 1;
            }
            bu = min(bu,dp[s][1]-dp[s][3]);
        }
        if(flag==0)
        {
            dp[x][3]+=bu;
        }
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    int root;
    for(int i = 1;i<=n;i++)
    {
        int num;
        scanf("%d",&num);
        if(i==1)
        {
            root = num;
        }
        scanf("%d",&money[num]);
        dp[num][1] = money[num];
        scanf("%d",&son[num][0]);
        for(int j = 1;j<=son[num][0];j++)
        {
            scanf("%d",&son[num][j]);
        }
    }
    dfs(root);
    printf("%d",min(dp[root][1],dp[root][3]));
}

原文地址:https://www.cnblogs.com/lizitong/p/10024852.html

时间: 2024-11-09 02:15:15

小胖守皇宫(VIJOS P1144 )题解的相关文章

vijos1144(小胖守皇宫)

也是ural1039 描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同. 可是xuzhenyi手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫. 帮助xuzhenyi布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少. 格式 输入格式 输入文件中数据表示一棵树,描述如下: 第1行 n

树形dp小胖守皇宫(vijosP1144)

题目链接:https://vijos.org/p/1144 题解:这道题的动归稍稍有一点的复杂,因为一个节点有可能被它的子节点观察,也有可能被父节点观察: 所以我们这样表示: f[i][0](表示当前i节点放了一个看守,即他自己和所有子节点已经被控制好) f[i][1](表示当前i节点不放看守,但是他自己和所有子节点已经被控制好) f[i][2](表示当前解点不放看守,子节点已被控制好但他自己没被控制) f[i][0]=sum(min(f[son][0],f[son][1],f[son][2])

Vijos1144小胖守皇宫【树形DP】

皇宫看守 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫.皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同.可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫.编程任务:帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得花费的经费最少. 输入格式: 输入数据由文件名为Guard.in的文本文件提供.输入文件中数据表示一棵树,描述如下:第1行 n,表示树中

区间 (vijos 1439) 题解

[问题描述] 现给定n个闭区间[ai,bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列.这里如果说两个区间[a, b]和[c, d]是按照升序排列的,那么我们有a<b<=c<=d. [样例输入] 5 5 6 1 4 10 10 6 9 8 10 [样例输出] 1  4 5 10 [解题思路] 本题为SDOI 2005 day2 第一题,是区间覆盖问题的变种,其实,看了问题描

acm常见算法及例题

转自:http://blog.csdn.net/hengjie2009/article/details/7540135 acm常见算法及例题 初期:一.基本算法:     (1)枚举. (poj1753,poj2965)     (2)贪心(poj1328,poj2109,poj2586)     (3)递归和分治法.     (4)递推.     (5)构造法.(poj3295)     (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996)二.图算法

ACM算法总结及刷题参考

参考:http://bbs.byr.cn/#!article/ACM_ICPC/11777 OJ上的一些水题(可用来练手和增加自信)(poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法: (1)枚举. (poj1753,poj2965)    (2)贪心(poj1328,poj2109,poj2586)    (3)递归和分治法.     (4)递推.     (5)构造法.(po

算法分类合集(转)

ACM 所有算法 数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列双端队列可并堆左偏堆 二叉查找树Treap伸展树 并查集集合计数问题二分图的识别 平衡二叉树 二叉排序树 线段树一维线段树二维线段树 树状数组一维树状数组N维树状数组 字典树 后缀数组,后缀树 块状链表 哈夫曼树 桶,跳跃表 Trie树(静态建树.动态建树) AC自动机 LCA和RMQ问题 KMP算法 图论 基本图算法图广度优先遍历深度优先遍历拓扑排序割边割点强连通分量Tarjan算法双连通分量强连通分支及其缩点图的割边和

C语言-让生活更美好

1.智能车 1)避障车 2)平衡车 3)WIFI视频车 2.萝莉语音温度播报 3.万年不变的万年历 4.采矿致富车--------------电赛作品--金属探测车 5.基于物联网的家庭安防系统-----九宫格解锁(隔空解锁) 6.基于心理治疗的儿童电子琴 7.蓝牙防丢器 8.操作系统 9.喂水器:(小狗走近就会滴水) 10.喂食器:(小狗走近就会落食) 举几个用c开发的程序例子. QQ notepad(记事本).notepad++.notepad2 pidgin(全平台的聊天软件) apach

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京