其他分享
首页 > 其他分享> > POJ3342 Party at Hali-Bula(树形DP)

POJ3342 Party at Hali-Bula(树形DP)

作者:互联网

dp[u][0]表示不选u时在以u为根的子树中最大人数,dp[u][1]则是选了u后的最大人数;

f[u][0]表示不选u时的唯一性,f[u][1]是选了u后的唯一性,值为1代表唯一,0代表不唯一。

当不选u时,u的子节点v可选可不选,dp[u][0]+=max(dp[v][0],dp[v][1]),再根据所选判断f[u][0];

当选u时,u的子节点都不可选,dp[u][1]+=dp[v][0],再判断f[u][1];

在这里可以用map将人名映射为数字,map<string,int> mp 。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<string>
 5 #include<cstring>
 6 #include<map>
 7 #include<vector>
 8 using namespace std;
 9 int dp[210][2],f[210][2];
10 vector<int>E[210];
11 
12 void dfs(int u){
13     dp[u][0]=0;
14     dp[u][1]=1;
15     for(int i=0;i<E[u].size();i++){
16         int v=E[u][i];
17         dfs(v);
18         if(dp[v][0]==dp[v][1]){
19             dp[u][0]+=dp[v][0];
20             f[u][0]=0;
21         }
22         else if(dp[v][0]>dp[v][1]){
23             dp[u][0]+=dp[v][0];
24             if(!f[v][0]) f[u][0]=0;
25         }
26         else{
27             dp[u][0]+=dp[v][1];
28             if(!f[v][1]) f[u][0]=0;
29         }
30         dp[u][1]+=dp[v][0];
31         if(!f[v][0]) f[u][1]=0;
32     }
33 }
34 
35 int main(){
36     int n,k;
37     string s1,s2;
38     map<string,int> mp;//将字符串映射为数字
39     while(cin>>n&&n){
40         mp.clear();
41         for(int i=0;i<=n;i++) E[i].clear(); //清空
42         memset(f,1,sizeof(f));//初始都设为唯一
43         k=1;
44         cin>>s1;
45         mp[s1]=k++;
46         E[0].push_back(mp[s1]);//增加超根
47         for(int i=1;i<=n-1;i++){
48             cin>>s1>>s2;
49             if(mp[s1]==0) mp[s1]=k++;
50             if(mp[s2]==0) mp[s2]=k++;
51             E[mp[s2]].push_back(mp[s1]);
52         } 
53         dfs(0);//从根开始遍历
54         printf("%d ",dp[0][0]);
55         if(f[0][0]) printf("Yes\n");
56         else printf("No\n"); 
57     } 
58     return 0;
59 }

 

标签:POJ3342,int,s2,s1,mp,Hali,Party,include,dp
来源: https://www.cnblogs.com/yhxnoerror/p/16387736.html