博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA-1220 Party at Hali-Bula (树的最大独立集)
阅读量:4914 次
发布时间:2019-06-11

本文共 1470 字,大约阅读时间需要 4 分钟。

题目大意:数的最大独立集问题。特殊在要求回答答案是否唯一。

题目分析:定义状态dp(i,1),dp(i,0)分别表示以i为根节点的子树选不选i最多可选的人数,f(i,1),f(i,0)分别表示以i为根节点的子树选不选i的方案唯一性。则当选i时,i的子节点都不能选,否则,可选可不选,因此状态转移方程如下:

dp(i,1)=sum(dp(j,0)  其中,j是i的子节点

dp(i,0)=sum(max(dp(j,1),dp(j,0)))  其中,j是i的子节点

至于当前状态的唯一性,则受下一步决策的唯一性所影响。

 

代码如下:

# include
# include
# include
# include
# include
# include
using namespace std;int n,dp[205][2],f[205][2];string p,q;map
mp;vector
sons[205];int DP(int u,int k){ if(dp[u][k]!=-1) return dp[u][k]; if(sons[u].empty()){ f[u][k]=1; return dp[u][k]=k; } int l=sons[u].size(); int ans=k; if(k==1){ f[u][k]=1;///唯一性受下一步决策的影响 for(int i=0;i
b){ ans+=a; if(f[sons[u][i]][1]==0) f[u][k]=0; }else if(a==b){ ans+=a; f[u][k]=0; }else{ ans+=b; if(f[sons[u][i]][0]==0) f[u][k]=0; } } } return dp[u][k]=ans;}int main(){ while(scanf("%d",&n)&&n) { mp.clear(); memset(dp,-1,sizeof(dp)); for(int i=1;i<=n;++i) sons[i].clear(); int cnt=1; cin>>p; mp[p]=cnt++; for(int i=1;i
>p>>q; if(mp[p]==0) mp[p]=cnt++; if(mp[q]==0) mp[q]=cnt++; sons[mp[q]].push_back(mp[p]); } ///一开始以为大BOSS必须要到场,WA了两次后才意识到大BOSS应该和其他员工一视同仁!!! int a=DP(1,1),b=DP(1,0); if(a>b){ printf("%d ",a); if(f[1][1]==1) printf("Yes\n"); else printf("No\n"); }else if(a==b){ printf("%d ",a); printf("No\n"); }else{ printf("%d ",b); if(f[1][0]==1) printf("Yes\n"); else printf("No\n"); } } return 0;}

  

  

转载于:https://www.cnblogs.com/20143605--pcx/p/4793072.html

你可能感兴趣的文章
XML解析之SAX详解
查看>>
leetcode 338. Counting Bits
查看>>
NUMBER类型细讲
查看>>
【Python】装饰器实现日志记录
查看>>
配置tomcat8.0环境变量
查看>>
Django模板语言进阶
查看>>
解决linux-mysql Access denied for user 'root'@'localhost'
查看>>
epoll讲解
查看>>
Android内存泄漏分享
查看>>
BZOJ 2038
查看>>
Unity场景道具模型拓展自定义编辑器
查看>>
AngularJS指令
查看>>
跟着编程之美学算法——字符串相似度
查看>>
JavaWeb图片显示与存储
查看>>
Activity---弹出右侧窗口
查看>>
inno setup相关
查看>>
vue 项目规范
查看>>
PHP 文件上传
查看>>
认识“闭包”
查看>>
<nginx+PHP>nginx环境下配置支持php7
查看>>