洛谷 P1271 聚会的快乐(树状dp)
题目描述
你要组织一个由你公司的人参加的聚会。你希望聚会非常愉快,尽可能多地找些有趣的热闹。但是劝你不要同时邀请某个人和他的上司,因为这可能带来争吵。给定N个人(姓名,他幽默的系数,以及他上司的名字),编程找到能使幽默系数和最大的若干个人。
输入输出格式
输入格式:
第一行一个整数N(N<100)。接下来有N行,每一行描述一个人的信息,信息之间用空格隔开。姓名是长度不超过20的字符串,幽默系数是在0到100之间的整数。
输出格式:
所邀请的人最大的幽默系数和。
输入输出样例
5
BART 1 HOMER
HOMER 2 MONTGOMERY
MONTGOMERY 1 NOBODY
LISA 3 HOMER
SMITHERS 4 MONTGOMERY
8
这道题是一道树状dp的入门题目,树状dp的基本思想就是从某节点依次向下层递归,其实和经典的数塔问题没什么区别,这个题就是每个人可以有多个下属(每个节点可以有多个儿子)。
然后难点就是当此节点的人参加聚会时和不参加聚会时的情况处理,详细解释已经写到注释里了。
代码如下:
#include <bits/stdc++.h> using namespace std;
#define inf 0x3f3f3f3f
int n,dp[][],value[],son[],vson[][],topnode,ans;
/*
dp[i][0]表示不让第i人参加聚会的最大值,dp[i][1]让第i个人参见聚会的最大值
value[i]表示第i人的幽默系数
son[i]表示第i个人有多少个下属 vson[i][j]表示第i人的第j个下属是谁
topnode 表示整个公司最上层的人,她没有上司
*/
bool vis[][];//记忆化搜索的标记数组
string namee[],upp[];//分别表示第i人的名字和其上司的名字
int dfs(int i,int j)
{
if (vis[i][j])
return dp[i][j];
vis[i][j]=true;
if (i==)
return ;
if (j==)//这个人参加聚会
{
dp[i][j]=value[i];
for (int k=;k<=son[i];++k)
dp[i][j]+=dfs(vson[i][k],);//他的下属都不能参加聚会,在这条件下找最大值
}
else//人不参加聚会
{
for (int k=;k<=son[i];++k)
dp[i][j]+=max(dfs(vson[i][k],),dfs(vson[i][k],));//他的下属可以有参加或者不参加两种情况
}
return dp[i][j];
}
int main()
{ //freopen("de.txt","r",stdin);
scanf("%d",&n);
memset(son,,sizeof son);
memset(dp,,sizeof dp);
memset(vson,,sizeof vson);
memset(vis,false,sizeof vis);
for (int i=;i<=n;++i)
cin>>namee[i]>>value[i]>>upp[i];
for (int i=;i<=n;++i)
{
bool haveUpp=false;//haveupp表示该人是否有上司
for (int j=;j<=n;++j)
{
if (i==j)
continue;
if (namee[j]==upp[i])
{
haveUpp=true;
vson[j][++son[j]]=i;//把上下属关系处理
break;
}
}
if (!haveUpp)
topnode=i;
}
ans=max(dfs(topnode,),dfs(topnode,));//因为最上层的人也有参加不参加两种可能
printf("%d\n",ans);
return ;
}
洛谷 P1271 聚会的快乐(树状dp)的更多相关文章
- [洛谷P1198/BZOJ1012][JSOI2008] 最大数 - 树状数组/线段树?
其实已经学了树状数组和线段树,然而懒得做题,所以至今没写多少博客 Description 现在请求你维护一个数列,要求提供以下两种操作: 1. 查询操作. 语法:Q L 功能:查询当前数列中末尾L个数 ...
- 洛谷P3688/uoj#291. [ZJOI2017]树状数组
传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...
- 洛谷P3368 【模板】树状数组 2
P3368 [模板]树状数组 2 102通过 206提交 题目提供者HansBug 标签 难度普及/提高- 提交 讨论 题解 最新讨论 暂时没有讨论 题目描述 如题,已知一个数列,你需要进行下面两 ...
- 洛谷P3374 【模板】树状数组 1
P3374 [模板]树状数组 1 140通过 232提交 题目提供者HansBug 标签 难度普及/提高- 提交 讨论 题解 最新讨论 题目描述有误 题目描述 如题,已知一个数列,你需要进行下面两 ...
- 洛谷 P3368 【模板】树状数组 2
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- 洛谷 P3374 【模板】树状数组 1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- 树状数组模板(pascal) 洛谷P3374 【模板】树状数组1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- 洛谷 P3368 【模板】树状数组 2(区间修改点查询)
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...
- 洛谷 P3368 【模板】树状数组 2 题解
P3368 [模板]树状数组 2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个 ...
随机推荐
- fedora23下编译安装OpenCV-3.1.0
所需安装环境 1.安装编译环境 $ sudo dnf install gcc gcc-c++ ncurses-devel cmake 2.安装gtk+2.x $ sudo dnf install gt ...
- vue开发微信公众号--开发准备
由于工作项目的原因,需要使用vue开发微信公众号,但是这种微信公众号更多是将APP套了一个微信的壳子,除了前面的授权和微信有关系以外,其他的都和微信没多大的关系了,特此记录 开发流程 首先需要在电脑上 ...
- 2018-2019-2 《Java程序设计》第11周学习总结
20175319 2018-2019-2 <Java程序设计>第11周学习总结 教材学习内容总结 本周学习<Java程序设计>第十三章java网络编程: - URL类 URL类 ...
- printf ("%*.*s")
小数点.后“*”表示输出位数,具体的数据来自参数表printf格式字符串中,与宽度控制和精度控制有关的常量都可以换成变量,方法就是使用一个“*”代替那个常量,然后在后面提供变量给“*”. 同样,小数点 ...
- WIN7 下的 filemon 版本
http://blog.sina.com.cn/s/blog_594398e80100tx1q.html WIN7 下的 filemon 版本 (2011-09-26 22:26:12) 标签: fi ...
- Iconv作用以及安装问题解决
当我们在使用Window操作系统的时候,可能使用最多的文本格式就是txt了,但是当我们将Window平台下的txt文本文档拷贝到Linux平台下查看时,发现原来的中文全部变成了乱码.没错, 引起这个结 ...
- iterm2简易登录服务器
文章目录 添加文件 添加配置 直接登录 方法一 方法二 添加文件 在mac任意目录添加 10.0.1.1.txt ,这里的名字可以随意起,也可以不是txt #!/usr/bin/expect set ...
- 并发数/QPS/PV/ 服务器响应时间公示
QPS:每秒查询率(Query Per Second) ,每秒的响应请求数,也即是最大吞吐能力.QPS = req/sec = 请求数/秒QPS统计方式 [一般使用 http_load 进行统计]QP ...
- <读书笔记>JavaScript系列之7种创建对象(面向对象)
写在前面: 以下三选一: 阅读博文JavaScript 对象详解. 阅读<JavaScript权威指南>第6章. 阅读<JavaScript高级程序设计>第6章. 注意:只需要 ...
- WebForm 用户控件 委托 实现 textbox后台赋值 调用端处理实现 textchange
新建一个简单的用户控件,如下图所示 textbox只读,button按钮模拟实现一堆业务逻辑后对textbox赋值. 用户控件后台代码也很简单 public partial class UTTCont ...