题目描述

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][];
void dfs(int x)
{
if(!son[x][])
{
dp[x][] = money[x];
dp[x][] = money[x];
dp[x][] = ;
return ;
}else
{
for(int i = ;i<=son[x][];i++)
{
dfs(son[x][i]);
}
for(int i = ;i<=son[x][];i++)
{
int s = son[x][i];
dp[x][] += min(dp[s][],min(dp[s][],dp[s][]));//自己
dp[x][] += min(dp[s][],dp[s][]);//父亲
}
bool flag = ;
int bu = ;
for(int i = ;i<=son[x][];i++)
{
int s = son[x][i];
dp[x][] += min(dp[s][],dp[s][]);
if(dp[s][]>=dp[s][])
{
flag = ;
}
bu = min(bu,dp[s][]-dp[s][]);
}
if(flag==)
{
dp[x][]+=bu;
}
}
}
int main()
{
int n;
scanf("%d",&n);
int root;
for(int i = ;i<=n;i++)
{
int num;
scanf("%d",&num);
if(i==)
{
root = num;
}
scanf("%d",&money[num]);
dp[num][] = money[num];
scanf("%d",&son[num][]);
for(int j = ;j<=son[num][];j++)
{
scanf("%d",&son[num][j]);
}
}
dfs(root);
printf("%d",min(dp[root][],dp[root][]));
}

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

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

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

  2. vijos 小胖守皇宫

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

  3. vijos1144(小胖守皇宫)

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

  4. 树形dp 之 小胖守皇宫

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

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

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

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

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

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

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

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

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

  9. 区间 (vijos 1439) 题解

    [问题描述] 现给定n个闭区间[ai,bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排 ...

随机推荐

  1. APS.NET MVC + EF (04)---路由和数据传递

    4.1 视图引擎 ASP.NET MVC 提供两种视图引擎:ASPX(C#)和Razor(CSHTML),推荐使用Razor. 4.1.1 Razor的语法 在Razor视图中,所有的服务器端代码都是 ...

  2. Elasticsearch DSL 常用语法介绍

    课程环境 CentOS 7.3 x64 JDK 版本:1.8(最低要求),主推:JDK 1.8.0_121 Elasticsearch 版本:5.2.0 相关软件包百度云下载地址(密码:0yzd):h ...

  3. Js中级复习

    JS中级复习—— 1,this   就是js的关键字 用途:指向某一个对象 如何判断this指向: 函数(方法)内—— 一种以函数的方式调用(不带.)this指向window 一种以方法的形式调用(函 ...

  4. [摘录] 当页[ModalRoute.of(context)]路由属性详解

    ModalRoute.of(context) API可以获取当前路由对象,通过它我们可以获取关于当前页面的所有属性: 属性: isActive 当前路由是都位于navigator中:如果该路由acti ...

  5. android中fragment卡顿的原因

    首页的ViewPager有十几个Fragment,在快速切换的时候,容易产生卡顿现象. 二.分析当ViewPager切换到当前的Fragment时,Fragment会加载布局并显示内容,如果用户这时快 ...

  6. Java 浮点数的精确度问题

    题目:分别获取数字的整数部分.小数部分,如15.12,整数部分为15,小数部分为0.12 package my_package; public class Divide { public static ...

  7. IOS 微信、QQ、叮叮等APP虚拟定位 实在太好用了

    前不久爱思助手更新了最新版本:V7.96,同时更新了好几个功能,包括给ios设备修改虚拟定位功能,想要给手机修改,我们需要电脑下载爱思助手最新版本V7.96,数据线连接电脑修改. 借助爱思助手的虚拟定 ...

  8. 认识Redis

    认识的Redis 官方原文: Redis is an open source (BSD licensed), in-memory data structure store, used as a dat ...

  9. IDEA创建本地Spark程序,并本地运行

    1   IDEA创建maven项目进行测试 v创建一个新项目,步骤如下: 选择“Enable Auto-Import”,加载完后:选择“Enable Auto-Import”,加载完后: 添加SDK依 ...

  10. sqlserver语句随笔

    替换数据:update 表名 set 列=replace(列,'要替换的数据','替换成的数据'),例子:update kers set KeyConn=replace(KeyConn,'-','/' ...