码迷,mamicode.com
首页 > 其他好文 > 详细

人品问题

时间:2020-07-11 12:50:17      阅读:76      评论:0      收藏:0      [点我收藏+]

标签:输入数据   input   col   crp   数据   amp   理论   意义   size   

人品问题( 树型dp\(\star?\))

  • 时限:\(1s\) 内存:\(10M\)

Descrption

  • 网上出现了一种高科技产品——人品测试器。只要你把你的真实姓名输入进去,系统将自动输出你的人品指数。把儿不相信自己的人品为 \(0\)
  • 经过了许多研究后,把儿得出了一个更为科学的人品计算方法。这种方法的理论依据是一个非常重要的结论:人品具有遗传性。一个人的人品完全由他的祖先决定。
  • 把儿提出的人品计算方法相当简单,只需要将测试对象的 \(k\) 个祖先的人品指数(可能为负数)加起来即可。选择哪 \(k\) 个祖先可以由测试者自己决定,但必须要满足这个要求:如果除自己的父母之外的某个祖先被选了,那么他的下一代必需要选(不允许跳过某一代选择更远的祖先,否则将失去遗传的意义)。
  • 非常不幸的是,把儿测试了若干次,他的人品值仍然不能为一个正数。现在把儿需要你帮助他找到选择祖先的最优方案,使得他的人品值最大。

Input

  • 第一行是两个用空格隔开的正整数 \(n\)\(k\),其中 \(n\) 代表把儿已知的家谱中共有多少人(包括把儿本身在内),\(k\) 的意义参见问题描述。
  • 数据的第二行有 \(n-1\) 个用空格隔开的整数(可能为负),这些数的绝对值在 \(2^{15}\) 以内。其中,第 \(i\) 个数表示编号为 \(i+1\) 的人的人品值。我们规定,编号为 \(1\) 的人是把儿。
  • 接下来 \(n\) 行每行有两个用空格隔开的数,其中第 \(i\) 行的两个数分别表示第 \(i\) 个人的父亲和母亲的编号。如果某个人的父亲或母亲不在这个家谱内,则在表示他的父亲或母亲的编号时用 \(0\) 代替。
  • 输入数据中除把儿以外的所有人都是把儿的祖先,他们都会在输入数据中作为父亲或母亲被描述到。输入数据中每个人都不可能同时作为多个人的父亲或者是母亲

Output

  • 输出只有一行,为把儿能够得到的最大人品值

Sample Input

6 3
-2 3 -2 3 -1
2 3
4 5
0 6
0 0
0 0
0 0

Sample Output

4

Hint

  • 显然,选择祖先\(2,3,5\)能使把儿的人品值达到最大。这个最大值为 \(4\)
  • 对于 \(50\%\) 的数据,\(n<=10\)
  • 对于\(100\%\) 的数据,\(n<=100\)
  • 来源:

分析

  • 典型的基础树归。

Code

#include <bits/stdc++.h>
const int maxn=100+5,Inf=0x3f3f3f3f;
struct Edge{int mum,dad,rp;}e[maxn];
bool vis[maxn][maxn];//记忆化用,因为人品值可负可正,需要一个数组来标记状态
int dp[maxn][maxn],n,k;
int dfs(int u,int cnt){//u为根的子树选cnt个节点
    if(vis[u][cnt])return dp[u][cnt];//记忆化
    if(!cnt)return dp[u][cnt]=0;//一个都不选人品为0
    if(!u)return dp[u][cnt]=-Inf;//u==0表示为空
    if(cnt==1)return dp[u][cnt]=e[u].rp;//只选一个选根就行
    int ans=-Inf;
    for(int i=0;i<cnt;++i)//枚举左右子树选的个数
        ans=std::max(ans,e[u].rp+dfs(e[u].mum,i)+dfs(e[u].dad,cnt-i-1));
    vis[u][cnt]=1;
    return dp[u][cnt]=ans;
}
void Solve(){
    scanf("%d%d",&n,&k);
    for(int i=2;i<=n;++i)
        scanf("%d",&e[i].rp);
    for(int i=1;i<=n;++i)
        scanf("%d%d",&e[i].mum,&e[i].dad);
    printf("%d\n",dfs(1,k+1));
}
int main() {
    Solve();
    return 0;
}

人品问题

标签:输入数据   input   col   crp   数据   amp   理论   意义   size   

原文地址:https://www.cnblogs.com/hbhszxyb/p/13283000.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!