题目描述
X星人的基因由A、B、C、D、E五种不同的结构组合而成。
如果两个性别不同的X星人的基因序列相似度大于50%,按照X星的法律他们是禁止结婚的,等于50%据说还是可以的。
那么基因的相似度怎么计算呢?分别从两个人身上取长度均为N的基因片段,如果它们的最长公共子序列为M,则相似度=M/N。是不是很简单呢?
现在给你两段X星人的基因序列片段,请你判断他们是不是可以结婚?
输入
每一组测试数据包含3行,
第1行数字N表示待比较基因序列片段的长度,N<=10^3。
第2行和第3行为两个长度为N的基因序列片段。
输入0表示结束。
输出
两个X星人是否可以结婚,如果可以输出”Yes“,如果不可以输出”No“。
样例输入 Copy
8
A B C D E A B C
A C C D C B A E
6
A B C D E E
A E D C B B
0
样例输出 Copy
Yes
Yes
#include<bits/stdc++.h>
using namespace std;
int main() {
int n;
while (cin>>n&&n!=0) {
vector<char>s1(n);
vector<char>s2(n);
for (int i=0;i<n;i++) {
cin>>s1[i];
}
for (int i = 0;i<n; i++) {
cin>>s2[i];
}
vector<vector<int> >c(n+1,vector<int>(n + 1));
for(int i=0;i<n;i++) {
for (int j=0;j<n;j++) {
if (s1[i]==s2[j])
c[i+1][j+1] = c[i][j]+1;
else
c[i+1][j+1]= max(c[i+1][j],c[i][j+1]);
}
}
int p=c[n][n];
double t= (double)p/n;
if (t-0.5>1e-10) {
printf("No\n",t);
}
else {
printf("Yes\n",t);
}
}
return 0;
}