题目:

国家探险队长 Jack 意外弄到了一份秦始皇的藏宝图,于是,探险队一行人便踏上寻宝之旅,去寻找传说中的宝藏。

藏宝点分布在森林的各处,每个点有一个值,表示藏宝的价值。它们之间由一些小路相连,小路不会形成环,即两个藏宝点之间有且仅有一条道路。探险队从其中的一点出发,每次他们可以留一个人在此点开采宝藏,也可以不留,然后其余的人可以分成若干队向这一点相邻的点走去。需要注意的是,如果他们把队伍分成两队或两队以上,就必须留一个人在当前点,提供联络和通讯,当然这个人也可以一边开采此地的宝藏。并且,为了节约时间,队伍在前往开采宝藏过程中是不会走回头路的。现在你作为队长的助理,根据已有的藏宝图,请计算探险队所能开采的最大宝藏价值。

注意:在整个过程中,每个人最多只能开采一个点的宝藏。

输入格式

第 1 行有 2 个整数 n 和 m。其中 n 表示藏宝点的个数(1≤n≤100),m 表示探险队的人数(1≤m≤100)。

第 2 行是 n 个不超过 100 的整数,分别表示 1 到 n 每个点的宝藏价值。

接下来 n-1 行,每行两个数,x 和 y(1≤x,y≤n,x≠y),表示藏宝点 x 与 y 之间有一条路,数据保证不会有重复的路出现。

假设一开始探险队在点 1 处。

输出格式

输出一个整数,表示探险队所能获得最大宝藏价值。

样例数据 1

输入  [复制]

5 3 
1 3 7 2 8 
1 2 
2 3 
1 4 
4 5

输出

16

备注

【数据范围】
对 40% 的输入数据 :1≤n≤30;m≤12。
对 100% 的输入数据 :1≤n≤100;m≤100。

题解:

树形dp··多叉树转二叉树处理附加维分配问题···很像选课··不过注意dp的一些细节··

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=;
int father[N],son[N],brother[N],f[N][N][],first[N],next[N*],go[N*],tot,n,m,val[N];
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
inline void comb(int a,int b)
{
next[++tot]=first[a],first[a]=tot,go[tot]=b;
next[++tot]=first[b],first[b]=tot,go[tot]=a;
}
inline void dfs(int u,int fa)
{
for(int e=first[u];e;e=next[e])
{
int v=go[e];if(v==fa) continue;
father[v]=u;dfs(v,u);
}
}
inline void dp(int u,int k,int t)
{
if(f[u][k][t]!=-) return;
if(u==||k==) {f[u][k][t]=;return;}
f[u][k][t]=;
if(t==) //只有父亲节点有人驻守才能分开
{
for(int i=;i<k;i++) //该节点留一个人
{
dp(son[u],i,),dp(brother[u],k-i-,);f[u][k][t]=max(f[u][k][t],f[son[u]][i][]+f[brother[u]][k-i-][]+val[u]);
}
for(int i=;i<=k;i++) //该节点不留人
{
dp(son[u],i,),dp(brother[u],k-i,);f[u][k][t]=max(f[u][k][t],f[son[u]][i][]+f[brother[u]][k-i][]);
}
}
else //否则只能儿子节点走完或者兄弟节点走完
{
dp(son[u],k,);dp(son[u],k-,);dp(brother[u],k,);
f[u][k][t]=max(f[u][k][t],max(f[son[u]][k][],f[brother[u]][k][]));
f[u][k][t]=max(f[u][k][t],f[son[u]][k-][]+val[u]);
}
return;
}
int main()
{
//freopen("a.in","r",stdin);
memset(f,-,sizeof(f));
n=R(),m=R();int a,b;
for(int i=;i<=n;i++) val[i]=R();
for(int i=;i<n;i++) a=R(),b=R(),comb(a,b);
dfs(,);for(int i=;i<=n;i++) brother[i]=son[father[i]],son[father[i]]=i;
dp(son[],m,);
cout<<f[son[]][m][]<<endl;
return ;
}

刷题总结——探险(ssoj)的更多相关文章

  1. 刷题总结——date(ssoj)

    题目: 题目背景 SOURCE:NOIP2015-SHY-9 题目描述 小Y和小Z好不容易有机会相见啦,可是邪恶的小H却不想让他们相见.现在有一些城市,城市之间有双向路径相连,有路径相连的城市之间可以 ...

  2. 【刷题】BZOJ 2407 探险

    Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...

  3. 《Data Structures and Algorithm Analysis in C》学习与刷题笔记

    <Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...

  4. LeetCode刷题系列

    LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...

  5. ife任务刷题总结(一)-css reset与清除浮动

    本文同时发布于本人的个人网站www.yaoxiaowen.com 百度创办的前端技术学院,是一个面向大学生的前端技术学习平台.虽然只有大学生才有资格报名,提交代码进行比赛排名.但是这并不妨碍我们这些初 ...

  6. 刷题ING...

    我用codeVS刷题.. 努力准备!!

  7. XidianOJ 1020 ACMer去刷题吧

    题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...

  8. 【BZOJ-4590】自动刷题机 二分 + 判定

    4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 156  Solved: 63[Submit][Status ...

  9. NOI题库分治算法刷题记录

    今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...

随机推荐

  1. 换个语言学一下 Golang (3)——数据类型

    在 Go 编程语言中,数据类型用于声明函数和变量. 数据类型的出现是为了把数据分成所需内存大小不同的数据,编程的时候需要用大数据的时候才需要申请大内存,就可以充分利用内存. Go 语言按类别有以下几种 ...

  2. opencv中mat的type

    type表示了矩阵中元素的类型以及矩阵的通道个数,它是一系列的预定义的常量,其命名规则为CV_(位数)+(数据类型)+(通道数),由type()返回,但是返回值是int型,不是OpenCV预定义的宏( ...

  3. 绘制方式和OpenGL枚举对应关系

    绘制方式和OpenGL枚举对应关系 图元类型 OpenGL枚举量 点 GL_POINTS 线 GL_LINES 条带线 GL_LINE_STRIP 循环线 GL_LINE_LOOP 独立三角形 GL_ ...

  4. 解决Error"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系

    今天写程序的时候调用到一个第三方的DLL文件,本机调试一切都正常,但是程序不是到服务器以后一直提示一个BUG:"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系".  ...

  5. hash join

    hash join是oracle里面一个非常强悍的功能,当做hash join时,oracle会选择一个表作为驱动表,先根据过滤条件排除不必要的数据,然后将结果集做成hash表,放入进程的hash a ...

  6. 怎样将Oracle数据库设置为归档模式及非归档模式

    怎样将Oracle数据库设置为归档模式及非归档模式 1.Oracle日志分类 分三大类: Alert log files--警报日志,Trace files--跟踪日志(用户和进程)和 redo lo ...

  7. 吐槽在cocos2dx游戏接入腾讯信鸽的坑

    腾讯信鸽是用来在后台推送消息给移动应用客户端使用,接入方法很简单,在信鸽官网注册个账号 http://xg.qq.com/xg,然后注册一个应用,在后台页面获得ACCESS ID, ACCESS KE ...

  8. 理解JWT的使用场景和优劣

    理解JWT的使用场景和优劣 淘楼小能手 百家号04-2816:20 经过前面两篇文章<JSON Web Token - 在Web应用间安全地传递信息><八幅漫画理解使用JSON We ...

  9. 14Shell脚本—判断语句

    判断语句 Shell脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字0,否则便返回其他随机数值. 条件测试语法的执行格式为 [ 条件表达式 ],切记,条件表达式两边均应有一个空格. 条 ...

  10. Linux 常用命令(三)

    一.less --分页查看文件:方面查阅(编辑)大文件 说明:支持方向键盘和鼠标向上向下浏览 -N 显示行号 二.head --output the first  part of files 默认显示 ...