思路:第一道树状DP,不太会,是按解题报告的思路写的。
地址:http://wenku.baidu.com/view/aee323cd0508763231121252
也就不多解释了
//352K
0MS
#include <stdio.h>
#include <string.h>
#define M 205
int dp[M][2],tree[M][M],unique[M][2];
char name[M][M/2];
int n,m;
int get_id (char str[])
{
< m;i ++)
if (strcmp (str,name[i]) == 0)
return i;
m)
//若没有则加进去
strcpy (name[m++],str);
return i;
0;
}
int max (int a ,int b)
{
> b ? a : b;
}
void dfs (int fat)
{
tree[fat][0];
1;i <= num; i ++)
int leaf = tree[fat][i];
dfs (leaf);
dp[fat][0] += max (dp[leaf][0],dp[leaf][1]);
dp[fat][1] += dp[leaf][0];
if (unique[leaf][0] ==
0)
//判断唯一性
unique[fat][1] = 0;
if ((dp[leaf][0] >
dp[leaf][1]&&unique[leaf][0] ==
0)||(dp[leaf][0]<dp[leaf][1]&&unique[leaf][1]
== 0)
||dp[leaf][0] == dp[leaf][1])
unique[fat][0] = 0;
}
int main ()
{
s1[M/2],s2[M/2];
(scanf("%d",&n)&&n)
memset (name,'\0',sizeof(name));
memset (dp,0,sizeof(dp));
memset (unique,0,sizeof(unique));
memset (tree,0,sizeof(tree));
m = 0;
for (i = 0;i < n;i ++)
{
dp[i][0] = 0;