首页 > 代码库 > HDU 2144 (最长连续公共子列 + 并查集) Evolution
HDU 2144 (最长连续公共子列 + 并查集) Evolution
我发现我一直理解错题意了,这里的子序列指的是连续子序列,怪不得我写的LCS一直WA
顺便复习一下并查集
1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <algorithm> 6 using namespace std; 7 8 const int maxn = 111; 9 int dp[maxn][maxn], parent[maxn], len[maxn];10 char DNA[maxn][maxn];11 12 int LCS(int a, int b)13 {14 int ans = 0;15 memset(dp,0,sizeof(dp));16 for(int i = 1; i <= len[a]; ++i)17 for(int j = 1; j <= len[b]; ++j)18 {19 if(DNA[a][i-1] == DNA[b][j-1])20 dp[i][j] = dp[i-1][j-1] + 1;21 if(dp[i][j] > ans)22 ans = dp[i][j];23 }24 return ans;25 }26 27 int GetParent(int a) 28 {29 return parent[a] == a ? a : parent[a] = GetParent(parent[a]);30 }31 32 int main(void)33 {34 #ifdef LOCAL35 freopen("2144in.txt", "r", stdin);36 #endif37 38 int n, kase = 0;39 double p;40 while(scanf("%d %lf", &n, &p) == 2)41 {42 for(int i = 0; i < n; ++i)43 {44 scanf("%s", DNA[i]);45 parent[i] = i;46 len[i] = strlen(DNA[i]);47 }48 for(int i = 0; i < n; ++i)49 for(int j = 0; j < i; ++j)50 {51 int pi = GetParent(i);52 int pj = GetParent(j);53 if(pi == pj) continue;54 double x = LCS(i, j) * 100.0;55 if(x/len[i]>p && x/len[j]>p)56 parent[pi] = pj;57 }58 int ans = 0;59 for(int i = 0; i < n; ++i)60 if(parent[i] == i)61 ++ans;62 printf("Case %d:\n%d\n", ++kase, ans);63 }64 return 0;65 }
HDU 2144 (最长连续公共子列 + 并查集) Evolution
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。