题目:

国家探险队长 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. iOS 微信和支付宝关于回调处理

    在支付这一块,发现讲支付集成的比较多,但是关于支付后回调处理的不多见,(当时因为这个问题懵逼了好久)就自己总结一下, 1.支付宝回调 支付宝的回调想对来说比较简单一些,因为支付宝的回调就在调起支付宝的 ...

  2. EditPlus 3.7激活码注册码

    EditPlus3.7激活教程以及EditPlus3.7激活码使用方法 EditPlus是一款功能齐全的文字编辑器,搭配其他的插件还可以实现很多的功能,还可以编辑和编译Java,调试程序等,主要用来打 ...

  3. HTML5中的Web Workers

    https://www.cnblogs.com/yanan-boke/p/6954390.html https://segmentfault.com/a/1190000014938305 HTML5 ...

  4. 题解 P1379 【八数码难题】

    传送门 用STL中的queue,map,string写了个广搜,用一个string保存状态(见代码)注:STL比较慢,可以做一些优化(或者开O2) #include<iostream> # ...

  5. localStorage对象

    localStorage对象存储的数据没有时间限制,比如:它可以存储到第二天,第三周,半年,或二三年,只要您的电脑没有重新安装系统或更换硬盘,数据仍然会被保留着. 实例: <!DOCTYPE h ...

  6. Virt-install用法:

       #一般选项:指定虚拟机的名称.内存大小.VCPU个数及特性等 -n  NAME,  --name=NAME:虚拟机名称,需全局惟一: -r  MEMORY,  --ram=MEMORY:虚拟机内 ...

  7. cena 测评机下载地址

    以下是cane的下载地址,现在分享给你们,希望有所帮助 下载地址百度云:https://pan.baidu.com/s/1JBXiVSZy-jhIc0V-F2ESPA 密码:hgtk 点击下载即可. ...

  8. Linux基础学习-使用vsftpd服务传输文件

    使用vsftpd服务传输文件 1 安装vsftpd [root@qdlinux ~]# yum install vsftpd Loaded plugins: product-id, search-di ...

  9. 15.Yii2.0框架where单表查询

    目录 新建控制器 HomeController.php 新建model article.php 新建控制器 HomeController.php D:\xampp\htdocs\yii\control ...

  10. python的标准模块

    本文用于记录python中的标准模块,随时更新. decimal模块(解决小数循环问题): >>> import decimal >>> a = decimal.D ...