刷题总结——探险(ssoj)
题目:
国家探险队长 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
备注
【数据范围】
对 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)的更多相关文章
- 刷题总结——date(ssoj)
题目: 题目背景 SOURCE:NOIP2015-SHY-9 题目描述 小Y和小Z好不容易有机会相见啦,可是邪恶的小H却不想让他们相见.现在有一些城市,城市之间有双向路径相连,有路径相连的城市之间可以 ...
- 【刷题】BZOJ 2407 探险
Description 探险家小T好高兴!X国要举办一次溶洞探险比赛,获奖者将得到丰厚奖品哦!小T虽然对奖品不感兴趣,但是这个大振名声的机会当然不能错过! 比赛即将开始,工作人员说明了这次比赛的规则: ...
- 《Data Structures and Algorithm Analysis in C》学习与刷题笔记
<Data Structures and Algorithm Analysis in C>学习与刷题笔记 为什么要学习DSAAC? 某个月黑风高的夜晚,下班的我走在黯淡无光.冷清无人的冲之 ...
- LeetCode刷题系列
LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...
- ife任务刷题总结(一)-css reset与清除浮动
本文同时发布于本人的个人网站www.yaoxiaowen.com 百度创办的前端技术学院,是一个面向大学生的前端技术学习平台.虽然只有大学生才有资格报名,提交代码进行比赛排名.但是这并不妨碍我们这些初 ...
- 刷题ING...
我用codeVS刷题.. 努力准备!!
- XidianOJ 1020 ACMer去刷题吧
题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...
- 【BZOJ-4590】自动刷题机 二分 + 判定
4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 156 Solved: 63[Submit][Status ...
- NOI题库分治算法刷题记录
今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...
随机推荐
- 棋盘问题——POJ1321
棋盘问题——深度优先搜索 题目描述: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘 ...
- python基础一 day15 面试题
# def demo():# for i in range(4):# yield i## g=demo()## g1=(i for i in g)# g2=(i for i in g1)## prin ...
- How to restrict root user to access or modify a file and directory in Linux
Now in this article I will show you steps to prevent or restrict access of root user to access certa ...
- mysql中的空值问题
MySQL的查询如果需要用到空值的情况下,where后面的条件就需要注意了 MySQL中的表示空值的方法:is null 和 is not null 比如:select * from user whe ...
- SQL数据库中各种字段类型的说明
(1)char.varchar.text和nchar.nvarchar.ntext char和varchar的长度都在1到8000之间,它们的区别在于char是定长字符数据,而varchar是 ...
- sql server 定时备份 脚本
) DECLARE @date DATETIME SELECT @date = GETDATE() SELECT @filename = 'G:\backup\NewPlulishSQL-' + CA ...
- Dede技巧
解决DEDE图集上传图片时跳出302错误 本地上传图集的时候突然提示网页出错,还爆出302错误. 解决办法是在include/userlogin.class.php文件中的第二行session_s ...
- manjaro18 配置国内镜像源
1.配置镜像源: sudo pacman-mirrors -i -c China -m rank 2.设置 archlinuxcn 源: sudo nano /etc/pacman.conf 添加以下 ...
- i2c_drivers个人分析
\arch\arm\mach-mx6\board-mx6q_sabresd.c static struct i2c_board_info i2c_board_info_rtc[] __initdata ...
- STM32HAL学习博客
https://www.cnblogs.com/wt88/category/1297945.html