小胖守皇宫(VIJOS P1144 )题解

题目描述

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

输入格式

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

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

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

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

输出格式

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


因为宫殿节点图是树的形状,因此很明显这是树形DP。it

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

dp[i][1]表示这个点被本身守卫。class

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])); }
相关文章
相关标签/搜索