HDU 2412 树状DP
来源:互联网 发布:sybase数据库查询语句 编辑:程序博客网 时间:2024/06/04 20:32
求最多人数直接树状DP就好了 跟HDU 1520类似
这题关键是求解是否唯一。。
看了某个PPT后了解到:
新加一个状态dup[i][j],表示相应的dp[i][j]是否是唯一方案。
对于叶子结点, dup[k][0] = dup[k][1] = 1.
对于非叶子结点,
对于i的任一儿子j,若(dp[j][0] > dp[j][1] 且 dup[j][0] == 0) 或 (dp[j][0] < dp[j][1] 且 dup[j][1] == 0) 或 (dp[j][0] == dp[j][1]),则dup[i][0] = 0
对于i的任一儿子j有dup[j][0] = 0, 则dup[i][1] = 0
对于叶子结点, dup[k][0] = dup[k][1] = 1.
对于非叶子结点,
对于i的任一儿子j,若(dp[j][0] > dp[j][1] 且 dup[j][0] == 0) 或 (dp[j][0] < dp[j][1] 且 dup[j][1] == 0) 或 (dp[j][0] == dp[j][1]),则dup[i][0] = 0
对于i的任一儿子j有dup[j][0] = 0, 则dup[i][1] = 0
#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>#include<algorithm>#include<vector>#include<map>#include<iostream>#include<string>using namespace std;#define maxn 220int dp[maxn][2];int dup[maxn][2];vector<int> vec[maxn];map<string,int> mp;void init(){ for(int i=0;i<maxn;i++) vec[i].clear(); mp.clear();}void dfs(int rt){ int sz=vec[rt].size(); for(int i=0;i<sz;i++) { int v=vec[rt][i]; dfs(v); dp[rt][0]+=max(dp[v][0],dp[v][1]); dp[rt][1]+=dp[v][0]; if(dp[v][0]>dp[v][1]&&dup[v][0]==0) dup[rt][0]=0; else if(dp[v][0]<dp[v][1]&&dup[v][1]==0) dup[rt][0]=0; else if(dp[v][0]==dp[v][1]) dup[rt][0]=0; if(dup[v][0]==0) dup[rt][1]=0; }}int main(){ freopen("in.txt","r",stdin); int n; while(scanf("%d",&n)==1&&n) { init(); string u,v; cin>>u; int cnt=1; if(mp[u]==0) mp[u]=cnt++; int i; for(i=0;i<n-1;i++) { cin>>u>>v; if(mp[u]==0) mp[u]=cnt++; if(mp[v]==0) mp[v]=cnt++; vec[mp[v]].push_back(mp[u]); } for(i=1;i<cnt;i++) { dp[i][0]=0; dp[i][1]=1; dup[i][0]=1; dup[i][1]=1; } dfs(1); if(dp[1][0]>dp[1][1]) { printf("%d ",dp[1][0]); if(dup[1][0]==0) printf("No\n"); else printf("Yes\n"); } else if(dp[1][0]<dp[1][1]) { printf("%d ",dp[1][1]); if(dup[1][1]==0) printf("No\n"); else printf("Yes\n"); } else if(dp[1][0]==dp[1][1]) printf("%d No\n",dp[1][1]); } return 0;}
- HDU 2412 树状DP
- hdu 3586 树状dp
- hdu 1520 树状 dp
- HDU 2196 树状DP
- HDU 4003 树状DP
- hdu 1011 树状dp。。
- hdu 6035-树状DP
- HDU 4123 树状DP+RMQ
- hdu 3450 树状数组 + dp
- hdu 2836 树状数组 + DP
- hdu 3450(树状数组+dp)
- hdu 2196 computer 树状dp
- hdu 2227 树状数组+dp
- HDU 4313 Matrix 树状DP
- hdu 4455(dp+树状数组)
- HDU 4707 简单树状dp
- HDU 2196 Computer(树状DP)
- HDU 4455 DP+树状数组
- 南北朝时,我国数学家祖冲之首先把圆周率值计算到小数点后六位,比欧洲早了1100年!
- linux配置java环境变量
- 在Varnish架构上编程的注意点(翻译)
- 杭电ACM1.2.1
- Linux下安装cppunit
- HDU 2412 树状DP
- 两个常见位操作面试题 不用加减乘除运算符计算两数之和及a=b*3
- linux 远程执行 shell脚本中nohup启动注意
- 新手开发asp.net模板引擎(1): 一个简单的模板
- response下载
- 命令行登录Mysql
- Objective-C中一种消息处理方法performSelector: withObject:
- 关键字 volatile
- javascript的lazy loading