vijos1144(小胖守皇宫)

也是ural1039

描述

huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫。

皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状;某些宫殿间可以互相望见。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。

可是xuzhenyi手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。

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

格式

输入格式

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

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

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

对于一个n(0<n≤15000<n≤1500)个结点的树,结点标号在1到n之间,且标号不重复。保证经费总和不超过231−1231−1

输出格式

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

样例1

样例输入1[复制]

6
1 30 3 2 3 4
2 16 2 5 6
3 5 0
4 4 0
5 11 0
6 5 0

样例输出1[复制]

25

限制

提示

选择3,4,2费用最小为25

来源

huyichen



题解

有一棵树,每个点或者相邻的点必须要驻扎人,求驻扎总费用最小,典型的树形动规

分析

对于节点i,有三种状态:1、自守   2、子守  3、父守

方程:

f[i,1]:=Σ(min{f[son,1],f[son,2],f[son,3]})+a[i]

f[i,2]:=Σ(min{f[son,1],f[son,2]})+m    //m的意思是所有son的自守与子守的差最小值,如果大于0就要加上这说明没有一个儿子是自守,不符合定义,就必须加上m,算作这个儿子守

f[i,3]:=Σ(f[son,2])          //son的自守情况已经被上面的情况包含了

第2种情况要特别注意,要求它的子结点中必须有一个是1状况的,所以令m=min{f[son[j],1]-f[son[j],2]},如果m>0说明在决策的时候,它的子结点没有一个是1状况的,这样就要加上m,否则令m=0.

这个方程看了一下午久才懂

AC代码

#include<iostream>
#include<cstdio>
#define MAX 1000000000
using namespace std;
int root,n,tot=0,num,c,m,kk;
int cost[1505];
int head[1505];
int from[1504];
int to[1504];
int f[1505][4];// 1自守,2子守,3父守
void add(int a,int b)
{
    tot++;
    to[tot]=b;
    from[tot]=head[a];
    head[a]=tot;
}
int _min(int a,int b)
{
    return a<b?a:b;
}
void treedp(int x)
{
    if(head[x]==0)//叶子节点
    {
        f[x][1]=f[x][2]=cost[x];
        return;
    }
    int m,t;
    f[x][1]=cost[x];
    f[x][2]=f[x][3]=0;
    m=MAX;
    while(head[x]>0)
    {
        t=to[head[x]];
        treedp(t);
        f[x][1]=f[x][1]+_min(f[t][1],_min(f[t][2],f[t][3]));
        f[x][2]=f[x][2]+_min(f[t][2],f[t][1]);
        f[x][3]=f[x][3]+f[t][2];
        if(m>f[t][1]-f[t][2])
            m=f[t][1]-f[t][2];
        head[x]=from[head[x]];
    }
    if(m>0) f[x][2]+=m;
}
int main()
{
    scanf("%d",&n);
    root=n*(n+1)/2;
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&num,&c,&m);
        cost[num]=c;
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&kk);
            root-=kk;
            add(num,kk);
        }
    }
    treedp(root);
    cout<<_min(f[root][1],f[root][2]);
    return 0;
}

时间: 2024-11-05 17:19:57

vijos1144(小胖守皇宫)的相关文章

Vijos1144小胖守皇宫【树形DP】

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

小胖守皇宫(VIJOS P1144 )题解

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

树形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])

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 南京

[SinGuLaRiTy] 动态规划题目复习

[SinGuLaRiTy-1026] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [UVA 1025] A Spy in the Metro 题目描述 特工玛利亚被送到S市执行一个特别危险的任务.她需要利用地铁完成他的任务,S市的地铁只有一条线路运行,所以并不复杂. 玛利亚有一个任务,现在的时间为0,她要从第一个站出发,并在最后一站的间谍碰头.玛利亚知道有一个强大的组织正在追踪她,她知道如果一直呆在一个车站,她会有很大的被抓的风险,躲