题目意思和POJ2342一样,只是多加了一个条件,如果最大方案数唯一,输出Yes,不唯一输出No
dp的是时候多加一个变量记录答案是否唯一即可
#include "stdio.h" #include "string.h" #include "vector" using namespace std; struct node { int fa; vector<int>child; }data[210]; struct comp { int x,y; // x记录最优值,y记录最优值是否唯一 }dp[210][2]; int vis[210]; void dfs(int cur) { int i,next; vis[cur]=1; for (i=0;i<data[cur].child.size();i++) { next=data[cur].child[i]; if (vis[next]==0) dfs(next); dp[cur][1].x+=dp[next][0].x; if (dp[next][0].y==1) dp[cur][1].y=1; if (dp[next][0].x>dp[next][1].x) { dp[cur][0].x+=dp[next][0].x; if (dp[next][0].y==1) dp[cur][0].y=1; } else if (dp[next][0].x<dp[next][1].x) { dp[cur][0].x+=dp[next][1].x; if (dp[next][1].y==1) dp[cur][0].y=1; } else { dp[cur][0].x+=dp[next][1].x; dp[cur][0].y=1; } } } int main() { int n,i,j,x,y,sum; char a[110],b[110],name[210][110]; while (scanf("%d",&n)!=EOF) { if (n==0) break; memset(vis,0,sizeof(vis)); memset(dp,0,sizeof(dp)); memset(data,0,sizeof(data)); scanf("%s",name[1]); sum=1; for (i=2;i<=n;i++) { scanf("%s%s",a,b); for (j=1;j<=sum;j++) if (strcmp(name[j],a)==0) break; x=j; if (j==sum+1) { sum++; strcpy(name[sum],a); } for (j=1;j<=sum;j++) if (strcmp(name[j],b)==0) break; y=j; if (j==sum+1) { sum++; strcpy(name[sum],b); } data[x].fa=y; data[y].child.push_back(x); } for (i=1;i<=sum;i++) dp[i][1].x=1; dfs(1); if (dp[1][1].x>dp[1][0].x) { printf("%d ",dp[1][1].x); if (dp[1][1].y==0) printf("Yes\n"); else printf("No\n"); } else if (dp[1][1].x<dp[1][0].x) { printf("%d ",dp[1][0].x); if (dp[1][0].y==0) printf("Yes\n"); else printf("No\n"); } else { printf("%d ",dp[1][0].x); printf("No\n"); } } return 0; }
POJ 3342 树形DP入门题
时间: 2024-10-26 23:01:06