题目描述

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

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

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

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

输入输出格式

输入格式

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

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

第2行至第\(n+1\)行,每行描述每个宫殿结点信息,依次为:该宫殿结点标号\(i(0<i<=n)\),在该宫殿安置侍卫所需的经费\(k\),该边的儿子数\(m\),接下来\(m\)个数,分别是这个节点的\(m\)个儿子的标号\(r_1,r_2,...,r_m\)。

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

输出格式

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

样例

样例输入

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

样例输出

25

题解

当我们分析一个节点的时候,很容易想到起码有两种情况:在这个节点设侍卫或者不设。但是如果单纯地只是分析它不设,那么依据题意,它必须得被观测到,那么它的子节点到底要不要设呢?此时便又要分两种情况:被儿子观测或是被父亲观测。因此到这里我们把这个题已经抽象成了三种状态转移:

  • \(f[i][1]\)表示在\(i\)节点的子节点设一个侍卫的最小经费(默认\(i\)节点自己不设)

  • \(f[i][2]\)表示在\(i\)节点设一个侍卫的最小经费

  • \(f[i][3]\)表示在\(i\)节点的父节点设一个侍卫的最小经费(默认\(i\)节点自己不设)

  • 1、\(f[i][1]\)表示i节点被它的子节点观测到,这时我们就要考虑:是不是子节点一定会再自己那里设一个观测点呢?当然不一定了,当且仅当子节点 \(f[son[i]][2]<f[son[i]][1]\)时,他才会在自己那里设。那么我们就需要找遍i的所有儿子,只要有一个儿子可以设就行了。这个怎么实现呢?我们只需先把所有儿子的\(min(f[v][1],f[v][2])\)累加到\(f[i][1]\)上,再取所有儿子的\(f[v][2]-min(f[v][1],f[v][2])\)最小值\(t\),如果这个最小值\(t\)不是0,就说明没有一个儿子打算在自己那里设点,就必须强迫一个儿子改变最优解,来满足i节点的需求,即用\(f[i][2]\)加上\(t\),若\(t\)是0,不影响,加上也无妨。

f[i][1]+=min(f[v][1],f[v][2]);//既然默认自己不会设点,就不可能有f[v][3]这个状态
f[i][1]+=t;
  • 2、\(f [ i ] [ 2 ]\) 表示\(i\)节点自己那里设了一个侍卫,既然自己已经设了一个,那么子节点的三种情况都要考虑。
f[i][2]+=min(f[v][1],f[v][2],f[v][3]);
  • 3、\(f [ i ] [ 3 ]\) 表示\(i\)节点被它的父节点观测到,那么除了\(f [ v ] [ 3 ]\)要被排除掉,其他的只要保证子节点可以被观测到即可。
f[i][3]+=min(f[v][1],f[v][2]);

代码

下面是参考代码:

#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn=1500+50,
INF=0x3f3f3f3f;
vector<int> son_id[maxn];
int f[maxn][4],//树形dp : 1=>son 2=>itself 3=>father
cnt[maxn],//出现次数
son_num[maxn],//儿子数目
cost[maxn];//所需的经费
int n;
void tree_dp(int x){
int ans=INF;
for(int i=0;i<son_num[x];i++){
int son=son_id[x][i];
tree_dp(son);
f[x][1]+=min(f[son][1],f[son][2]);
ans=min(ans,f[son][2]-min(f[son][1],f[son][2]));
f[x][2]+=min(f[son][1],min(f[son][2],f[son][3]));
f[x][3]+=min(f[son][1],f[son][2]);
}
f[x][1]+=ans;
f[x][2]+=cost[x];
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
int id;
cin>>id;
cin>>cost[id]>>son_num[id];
for(int j=1;j<=son_num[id];j++){
int x;cin>>x;
cnt[x]++;
son_id[id].push_back(x);
}
}
for(int i=1;i<=n;i++)
if(cnt[i]==0){
tree_dp(i);
cout<<min(f[i][1],f[i][2]);
}
return 0;
}

树形dp 之 小胖守皇宫的更多相关文章

  1. Vijos 1144 小胖守皇宫 【树形DP】

    小胖守皇宫 描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步 ...

  2. 【树形dp】vijos1144小胖守皇宫

    细节很精妙 描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步 ...

  3. [vijos1144]小胖守皇宫<树形dp>

    题目链接:https://vijos.org/p/1144 woc我竟然A了,这道经典的树形dp或者说是树形dp的入门题我终于过了,虽然之前做过一些树形dp的题,但是这题开始还是一脸懵逼,dp方程如何 ...

  4. 小胖守皇宫(VIJOS P1144 )题解

    题目描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每 ...

  5. vijos 小胖守皇宫

    点击打开题目 树形DP 显然会想到某个点放或不放守卫来定义状态,但在不放的情况下,需要分类讨论是父亲放还是一个儿子放,于是定义以下状态: f[root][0]表示自己不放,父亲也不放 f[root][ ...

  6. Vijos1144小胖守皇宫【树形DP】

    皇宫看守 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫.皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看 ...

  7. 【vijos1144】小胖守皇宫(树形DP)

    描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫 ...

  8. vijos1144(小胖守皇宫)

    也是ural1039 描述 huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:某些宫殿间可以互相望见.大内保卫森严,三步 ...

  9. 树形DP 复习

    树形DP 树形DP:建立在树上的动态规划 一般有两种传递方式:根→叶或叶→根 前者出现在换根DP中,一般操作是求出某一个点的最优解,再通过这一个点推知其他点的最优解. 后者是树形DP的常见形式,一般树 ...

随机推荐

  1. ORA-12514:监听程序无法识别

    使用plsql远程登录oracle数据库时,出现无法识别监听程序的错误.很大机率是配置文件出错. 配置文件如下: listener.ora是服务器端用的,oracle监听程序,就是读的这个文件,里面有 ...

  2. EM(最大期望)算法推导、GMM的应用与代码实现

    EM算法是一种迭代算法,用于含有隐变量的概率模型参数的极大似然估计. 使用EM算法的原因 首先举李航老师<统计学习方法>中的例子来说明为什么要用EM算法估计含有隐变量的概率模型参数. 假设 ...

  3. Java中设置多个Access-Control-Allow-Origin跨域访问

    1.如果服务端是Java开发的,添加如下设置允许跨域即可,但是这样做是允许所有域名都可以访问,不够安全. response.setHeader("Access-Control-Allow-O ...

  4. 关于日期格式你必须知道的坑( yyyy-MM-dd HH:mm:ss)

    java中的的日期格式为: yyyy-MM-dd HH:mm:ss:代表将时间转换为24小时制,例: 2018-06-27 15:24:21yyyy-MM-dd hh:mm:ss:代表将时间转换为12 ...

  5. 3、尚硅谷_SSM高级整合_使用ajax操作实现增加员工的功能

    20.尚硅谷_SSM高级整合_新增_创建员工新增的模态框.avi 1.接下来当我们点击增加按钮的时候会弹出一个员工信息的对话框 知识点1:当点击新增的时候会弹出一个bootstrap的一个模态对话框 ...

  6. MySQL按指定字符合并及拆分

    按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符).本文将举例演示如何进行按照指定字符合并及拆分. 1. 合并 M ...

  7. Springboot 集成 ElasticSearch 踩坑

    这里只涉及到基础使用 导包 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...

  8. linux主机连接sftp报错received unexpected end-of-file from SFTP server

    SFTP 连接主机失败,提示信息如下: 登陆目标主机,编辑查看 /etc/ssh/sshd_config 文件,找到 Subsystem 关键字 替换为 Subsystem sftp internal ...

  9. C++ Primer Plus(四)

    完整阅读C++ Primer Plus 系统重新学习C++语言部分,记录重要但易被忽略的,关键但易被遗忘的. 友元.异常和其他 1.抛出异常类时,虽然catch的是一个引用,但是也会产生一次拷贝,因为 ...

  10. html+css快速入门教程(2)

    3 标签 3.1 div div 标签表示一个区块或者区域,你可以把它看成是一个容器,比如说一个 竹篮 作用:用来把网页分块 并且里面可以装任意的html元素 <div>这里是一个div容 ...