【问题描述】

圣诞特别礼物挂在一棵圣诞树上,这棵树有n层,每层有一件礼物,每件礼物都有一个价值,有的礼物还有一些连结线,与下层的礼物相连,领取礼物的规则如下:任选一件礼物,它的下面如果有连结线,则可以继续取它连结的礼物,以此类推,直至取到没有连结线的礼物才结束,你如果是第一个去取,怎样取才能获得最大的价值呢?请你编一程序解决这一问题。

【输入文件】

输入文件tree.in的第一行只有一个数据n(n<=100),表示有n层礼物,以下有n行数据,分别表示第1-n层礼物的状态,每行至少由一个数据构成,且第一个数据表示该礼物的价值,后面的数据表示它与哪些层的礼物相连,如果每行只有一个数据则说明这层礼物没有与下层礼物相连,每个数的大小均不超过10000。

【输出文件】

输出文件tree.out也只有一个数,表示获得的取大价值。

【输入样例】

3

12 2 3

20

30

【输出样例】

42

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=u228

【题解】



设f[x]表示选第x层的礼物能够获得的最大价值;

f[x] = a[x];

f[x] = max(f[x],f[x]+max(f[x的儿子节点]);

最后1..n取最大的f值;

一棵树可能有多个根;

之前算过的f值就不要重复算了.

一行里面有未知个数的数字的;

可以用cin.peek()函数来判断是不是读到了行末



【完整代码】

#include <cstdio>
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define rei(x) scanf("%d",&x)
#define rel(x) scanf("%I64d",&x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int MAXN = 110; int n;
int a[MAXN],f[MAXN];
vector <int> g[MAXN];
bool bo[MAXN]; void dfs(int x)
{
f[x] = a[x];
bo[x] = true;
int len = g[x].size(),temp = -21e8;
rep1(i,0,len-1)
{
int y = g[x][i];
if (!bo[y])
dfs(y);
temp = max(temp,f[y]);
}
if (temp>0)
f[x]+=temp;
} int main()
{
//freopen("F:\\rush.txt","r",stdin);
cin >> n;
char t = getchar();//把换行符给读了
rep1(i,1,n)
{
int x;
rei(a[i]);
while (cin.peek()!=EOF)
{
if (isdigit(cin.peek()))
{
cin >> x;
g[i].pb(x);
}
if (cin.peek()=='\n')
break;
cin.ignore();
}
t = getchar();
}
rep1(i,1,n)
if (!bo[i])
{
dfs(i);
}
int ans = f[1];
rep1(i,2,n)
ans = max(ans,f[i]);
printf("%d\n",ans);
return 0;
}

最新文章

  1. python日期格式化与绘图
  2. 关于Ajax中http协议
  3. iptables之链之间的跳转
  4. WIN10环境下搭建与连接VPN服务器
  5. [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】
  6. 主要协议SCSI、FC、iSCSI
  7. Speex manul中文版
  8. Amazon S3 API
  9. 给已经编译运行的Apache增加mod_proxy模块的配置方法
  10. ViewController
  11. Grunt + Bower—前端构建利器
  12. JAVA上传与下载
  13. maven安装配置及使用maven创建一个web项目
  14. [20190416]完善shared latch测试脚本2.txt
  15. .Net上传图片的一些问题
  16. 工厂模式如何返回Spring的Bean
  17. [再寄小读者之数学篇](2014-06-20 求极限---Jordan 不等式的应用)
  18. canvas 填充图片
  19. if-else 重构
  20. Git笔记:Git介绍和常用命令汇总

热门文章

  1. Vue.之. 动态设置按钮Disabled
  2. 2019-8-30-win10-uwp-好看的时间选择控件
  3. vsync信号产生与分发
  4. 外贸电子商务网站之Prestashop paypal支付添加
  5. vagrant up提示&quot;Couldn&#39;t open file /path/to/base&quot;的错误解决方法
  6. PyCharm切换Python版本
  7. ABP 重写主键ID 多表查询ID无效
  8. 2019-6-23-WPF-网络-request-的-read-方法不会返回
  9. C++异常相关
  10. 【C++】为什么构造函数没有返回值?(转载)