时至至今,疫情还没结束,战斗并未停止!现如今,疫情肆虐全球,疫情的传播加速了病毒的变异,α病毒,β病毒,δ病毒,相继出现…
而小A对病毒的变异来了兴趣,带着高中学过的生物知识,小A了解到病毒可以表示为由A,U,C,G四种碱基组成的基因序列,而病毒的变异便来自于不同基因序列结合。在此,我们将两个不同的基因序列的结合定义为:两个基因序列上下排布,通过一定的错位,使得两个基因序列的部分碱基可以对应起来,若分属两个基因序列的A与U对应则形成3个氢键,若分属两个序列的C与G对应会形成2个氢键,如图所示:
顽固的病毒为了保证自己结构的稳定性,在变异过程中总会选择形成氢键个数最大的方式进行结合。现在给定两个基因序列,他们结合后的氢键个数是多少?
PS:题目描述的“结合”仅仅为本题目描述所定义,不一定符合真实的生物学性质。
输入格式:两行,每行一个字符串,分别是两个待结合的基因序列。(保证字符串只有A,U,C,G组成,且字符串的长度小于等于5000).
输出格式:一行一个整数,表示结合后的最大氢键个数。
输入样例:AGC UUCG输出样例:
7样例解释
共有6种可能的结合方式
AGC
UUCG
AGC
UUCG
AGC
UUCG
AGC
UUCG
AGC
UUCG
AGC
UUCG
其中形成氢键的个数分别为:3,0,0,7,0,0
则病毒序列会选择氢键个数为7的方式进行结合
对于两个病毒序列一定是有一个较长一些(不短于另一个),这样就可以看成一个短的字符串在一个长的字符串上依次移动。
具体类型我是分成了三种:
#include#include void swap(char** p1, char** p2); int main() { char virus_1[5000 + 1] = { " " }, virus_2[5000 + 1] = { " " }; int len_1, len_2,max = 0,sum = 0; scanf("%s %s", virus_1, virus_2); len_1 = strlen(virus_1); len_2 = strlen(virus_2); char* p1 = virus_1, * p2 = virus_2; if (len_1 > len_2) { int c; c = len_1; len_1 = len_2; len_2 = c; swap(&p1, &p2); } for (int i = 1; i < len_1 + len_2; i++) { if (i < len_1) { for (int j = 0; j < i; j++) { if ((p1[j] == 'C' && p2[len_2 - i + j] == 'G') || (p1[j] == 'G' && p2[len_2 - i + j] == 'C')) { sum += 2; } if ((p1[j] == 'A' && p2[len_2 - i + j] == 'U') || (p1[j] == 'U' && p2[len_2 - i + j] == 'A')) { sum += 3; } } } else { if (i >= len_1 && i <= len_2) { for (int j = 0; j < len_1; j++) { if ((p1[j] == 'C' && p2[len_2 - i + j] == 'G') || (p1[j] == 'G' && p2[len_2 - i + j] == 'C')) { sum += 2; } else { if ((p1[j] == 'A' && p2[len_2 - i + j] == 'U') || (p1[j] == 'U' && p2[len_2 - i + j] == 'A')) { sum += 3; } } } } else { if (i > len_2) { for (int j = 0; j < len_1 + len_2 - i; j++) { if ((p1[i - len_2 + j] == 'C' && p2[j] == 'G') || (p1[i - len_2 + j] == 'G' && p2[j] == 'C')) { sum += 2; } else { if ((p1[i - len_2 + j] == 'A' && p2[j] == 'U') || (p1[i - len_2 + j] == 'U' && p2[j] == 'A')) { sum += 3; } } } } } } if (sum > max) { max = sum; } sum = 0; } printf("%d", max); return 0; } void swap(char** p1, char** p2) { char* p; p = *p1; *p1 = *p2; *p2 = p; }



