题目大意是某些人将去参加一次party 但是他们和他们不能和他们的上司一起参加,问满足此条件的情况下能去的最多人数

首先由给出的条件建好树,我是用邻接矩阵来存的,主要是为了方便,实际上效率还是比较低的。

需要保存两个状态 一是某节点不用(即此人不去的情况)时该节点和该节点子树的最大值dp[i][0];

二是是用该节点时,该节点及其子树的最大值dp[i][1];

对于dp[i][1] 状态转移方程比较明显 dp[i][1]=1+∑(dp[j][0])j是i的“孩子”;因为 i 去,则他的孩子就不能去了,所以此种情况下,能去的最大人数就是在他所有孩子不去的情况下的最大人数加他自己了。

dp[i][0]:由于i不去,i的孩子j也可去可不去 此时状态转移方程为: dp[i][0]=∑(max(dp[i][0],dp[i][1]))

还需判断去的人数最多的情况,这些人是不是固定的。

对于叶子节点 pan[j][0]=1;pan[j][1]=1;表示人数是确定的。

对于任意节点i dp[i][1] 固定即pan[i][1]=1当且仅当 i 的所有孩子 j pan[j][0]=1;

dp[i][0] :

对于任意一个孩子 j 如果有 dp[ij[0]>dp[j][1]&&pan[j][0]==0或者 dp[j][0]<dp[j][1]&&pan[j][1]==0 或者dp[j][0]==dp[j][1]

pan[i][0]=0;

即,构成dp[i][0]的数据中,如果有一个是不确定的,那么dp[i][0]就是不确定的

我用的是记忆化搜索来实现DP的

代码:

#include <iostream>

#include <cstring>

#include <cstdlib>

#include <stdio.h>

#include <map>

#include <algorithm>

using namespace std;

int n;

bool rela[210][210];

bool pan[210][2];

int dp[210][2];

int main()

{

while (cin>>n&&n)

{

memset(rela,0,sizeof(rela));

memset(pan,1,sizeof(pan));

for(int i=0;i<=n;++i){

dp[i][0]=dp[i][1]=-1;

}

map<string,int> myMap;

int i(1);

string a,b;

cin>>a;

myMap[a]=i;

int j(1);

while (j<n)

{

cin>>a;

cin>>b;

if (!myMap.count(a)) myMap[a]=++i;

if (!myMap.count(b)) myMap[b]=++i;

rela[myMap[b]][myMap[a]]=1;

++j;

}

/*

j=1;

while(j<=n){

int k(1);

while(k<=n){

cout<<rela[j][k]<<" ";

++k;

}

cout<<endl;

++j;

}

*/

void dfs(int n);

j=1;

while (j<=n)

{

dfs(j);

++j;

}

bool mul(0);

int maxOut=max(dp[1][1],dp[1][0]);

if(dp[1][1]>dp[1][0]&&!pan[1][1]) mul=1;

if(dp[1][1]<dp[1][0]&&!pan[1][0]) mul=1;

if(dp[1][1]==dp[1][0]) mul=1;

cout<<maxOut<<" ";

if (mul) cout<<"No"<<endl;

else cout<<"Yes"<<endl;

}

return 0;

}

void dfs(int num)

{

int j(1);

int tempA(0);

bool mulA(0);

int tempB(0);

bool mulB(0);

bool isLeaf(1);

while (j<=n)

{

if (rela[num][j])

{

isLeaf=0;

if (dp[j][0]==-1)

dfs(j);

if (!pan[j][0]) mulB=1;

tempA+=max(dp[j][1],dp[j][0]);

if ((dp[j][1]>dp[j][0]&&!pan[j][1])||(dp[j][1]<dp[j][0]&&!pan[j][0])||(dp[j][1]==dp[j][0]))

mulA=1;

tempB+=dp[j][0];

}

++j;

}

if (isLeaf)

{

dp[num][0]=0;

dp[num][1]=1;

return;

}

dp[num][0]=tempA;

dp[num][1]=tempB+1;

if (mulA) pan[num][0]=0;

if (mulB) pan[num][1]=0;

return;

}

NKOJ 1791 Party at Hali-Bula(树状DP)相关推荐

  1. hdu 1561 The more, The Better_树状dp

    题目链接 题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小. 思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+d ...

  2. UVA10859 放置街灯 Placing Lampposts(树状DP)

    UVA10859 放置街灯 Placing Lampposts(树状DP) 这道题有两种解决方法,因为原图保证无重边无环无自环, 所以原图一定是一颗树(或森林).,都是树状DP,但是实现的过程大同小异 ...

  3. poj 1655 Balancing Act 树状dp

    //poj1655树状dp //求一个数的重心 // dfs找到节点v的各个子树的节点数 // 取最大值设为num[v],而v节点以上的子树的节点数 // 为总数-num[v]-1(包括v节点本身)设 ...

  4. HDU 4123 树状DP+RMQ

    /*************************************************************************************************** ...

  5. 树状dp(这个人写得好多转来慢慢看)

    树状动态规划定义 之所以这样命名树规,是因为树形DP的这一特殊性:没有环,dfs是不会重复,而且具有明显而又严格的层数关系.利用这一特性,我们可以很清晰地根据题目写出一个在树(型结构)上的记忆化搜索的 ...

  6. UVA 1220 Party at Hali-Bula (树状DP+记忆化搜索)

    Dear Contestant, I'm going to have a party at my villa at Hali-Bula to celebrate my retirement from ...

  7. 【tyvj1052】【树状dp】没有上司的舞会

    描述 Ural大学有N个职员,编号为1~N.他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司.每个职员有一个快乐指数.现在有个周年庆宴会,要求与会职员的快乐指数最大 ...

  8. Hduoj1011【树状DP】

    #include<stdio.h> #include<string.h> typedef struct room {int bug, po; } room; room R[11 ...

  9. HDU-4044 GeoDefense【树状dp+01背包】

    题意 一个塔防游戏里,地图是n个结点组成的树(1-n),其中1节点是敌人的出生点,所有叶子节点是我方基地.在每个节点上都有不同的防御塔可以建造,但每个节点最多只能造一座. 防御塔有 价格 和 伤害 两 ...

最新文章

  1. PS怎么将自己的形状存储为自定形状?
  2. 新一代Notebook神器出现,Jupyter危险了!
  3. javascript 的 ~ 操作符作用
  4. 无限踩坑系列(4)-远程登入服务器
  5. 100%有用的Photoshop实用快捷健介绍
  6. 河北省应用计算机模拟考试,河北省职称计算机考试模拟系统
  7. 人力资源管理数据分析
  8. 如何删除WORD中的空白行以及换行符
  9. 广东工业大学计算机学院张静,广东工业大学文件.doc
  10. 适合新手小白的苹果CMS安装与配置
  11. windows自带日语输入法快捷键
  12. [ZZ]通过修改键盘映射替代损坏按键
  13. MacOS Big Sur 如何安装创新SBX-Fi Surround 5.1Pro(USB外置)声卡?
  14. 转载-GNS3安装和使用教程(超详细)
  15. win7 32位系统搭建iphone开发环境
  16. 家长心态建设;一切都没想象的那么糟
  17. laravel sail的坑
  18. 四旋翼无人机学习第13节--Padstack Editor的简单使用
  19. 三个故事重新认识o:险竞优
  20. 【新年祝福】散去2009分,祝大家新年快乐,祝所有朋友新的一年里万事如意。

热门文章

  1. 【Android 逆向】函数拦截实例 ( ③ 刷新 CPU 高速缓存 | ④ 处理拦截函数 | ⑤ 返回特定结果 )
  2. 【Android 插件化】VirtualApp 源码分析 ( 目前的 API 现状 | 安装应用源码分析 | 安装按钮执行的操作 | 返回到 HomeActivity 执行的操作 )
  3. 【计算理论】计算复杂性 ( 无向图独立集问题 | 独立集问题是 NP 完全问题证明思路 | 证明独立集问题是 NP 完全问题 )
  4. 【C++ 语言】异常 ( 抛出字符串异常 | 抛出异常对象 | 抛出任意对象 | 抛出自定义异常 )
  5. 集合框架Map、List、Set
  6. PHP封装返回Ajax字符串和JSON数组
  7. Java 8 简明教程
  8. [实验]通过内核Patch去掉iOS-v4.3.3的沙盒特性
  9. 初学者如何开发出一个高质量的J2EE系统
  10. 集合改变时会自动通知的集合类