【题目链接】
http://acm.hdu.edu.cn/showproblem.php?pid=2144
题目意思
首先给定n个动物,和百分比p,接着给n个动物的dna。如果两动物的dna相同长度超过总长的百分比p就可以把两动物分成一类,问你最终这些动物分成多少类。
解题思路
对于分类问题不难想到用并查集,而判断两字符串相同最长长度就用最长子序列就可以了。时间给的比较多直接跑就可以了。
代码部分
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int ans;
char a[105][105];
int pre[105],len[105],dp[105][105];
int find(int x) ///查询
{
int tem=pre[x];
if (x==pre[x])
return x;
pre[x]=find(tem);
return pre[x];
}
int leng(int x,int y)
{
int l,s=0;
memset(dp[0],0,sizeof(dp[0]));
for (int i=1; i<=len[x]; i++) /// 求最长子序列
{
for (int j=1; j<=len[y];j++)
{
if (a[x][i]==a[y][j])
dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=0;
if (dp[i][j]>s)
s=dp[i][j];
}
}
return s;
}
int main()
{
int k=0;
int n;
float p;
while (scanf("%d %f",&n,&p)!=EOF)
{
ans=n;
for (int i=0; i<n; i++)
pre[i]=i;
for (int i=0; i<n; i++)
{
scanf("%s",a[i]+1);
a[i][0]=' ';
len[i]=strlen(a[i])-1;
for (int j=0; j<i; j++)
{
int x,y;
x=find(i);
y=find(j);
if (x==y) ///如果已经相连
continue;
else
{
int tmp;
tmp=leng(i,j);
if (tmp*100.0/len[i]>p&&tmp*100.0/len[j]>p)
{
ans--;
pre[x]=y; ///更新节点关系
}
}
}
}
printf("Case %d:\n%d\n",++k,ans);
}
return 0;
}