DNA sequence(DFS)

探讨在生物信息学中,如何寻找最短的DNA序列,使给定的多个DNA序列成为其子序列。这是一个关于计算分子生物学的问题,涉及到字符串匹配和算法优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DNA sequence

题目

二十一世纪是生物技术发展的世纪。我们知道基因是由DNA组成的。构建DNA的核苷酸碱基是A(腺嘌呤),C(胞嘧啶),G(鸟嘌呤)和T(胸腺嘧啶)。找到DNA /蛋白质序列之间最长的共同子序列是现代计算分子生物学中的基本问题之一。但这个问题有点不同。给定几个DNA序列,要求您从它们中制作一个最短的序列,以便每个给定的序列是它的子序列。
例如,给定“ACGT”,“ATGC”,“CGTT”和“CAGT”,您可以按以下方式制作序列。它是最短的但可能不是唯一的。

输入

第一行是测试用例编号t。然后是t测试案例。在每种情况下,第一行是整数n(1 <= n <= 8)表示DNA序列的数目。以下k行包含k个序列,每行一个。假设任何序列的长度在1到5之间。

输出

对于每个测试用例,打印一行,其中包含可以从这些序列中生成的最短序列的长度。

样本输入

1
4
ACGT
ATGC
CGTT
CAGT

样本输出

8

题意

找到一个字符串,输入的所有字符串均为它的序列。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
int ans;
//记录 n 个字符串 
char str[10][10];
//深度 
int deep;
int Max(int x,int y){
	if(x>y)return x;
	else return y;
}
char DNA[4]={'A','T','C','G'};
void dfs(int index,int len[])
{
	//大于限制的深度,不用往下搜索 
	if(index>deep) return;
	//预计还要匹配的字符串的最大长度
	int maxn=0;
	for(int i=0;i<n;i++)
	{
		maxn=Max(strlen(str[i])-len[i],maxn);
	}
	//条件全部满足即为最优解
	//当前的深度 + 最少还有加深的深度是否大于限制的长度,若是,则退回
	if(maxn==0)
	{
		ans=index;
		return;
	}
	//剪枝 
	if(index+maxn>deep) return;
	for(int i=0;i<4;i++)
	{
		int flag=0;
		int pos[10];
		for(int j=0;j<n;j++)
		{
			if(str[j][len[j]]==DNA[i]){
				flag=1;
				pos[j]=len[j]+1;
			}else{
				pos[j]=len[j];
			}
		}
		if(flag) dfs(index+1,pos);
		if(ans!=-1) return;
	}
}
int main()
{
	int t,i;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d",&n);
		deep=0;
		for(int i=0;i<n;i++){
			scanf("%s",str[i]);
			deep=Max(deep,strlen(str[i]));
		}
		ans=-1;
		int pos[10]={0};
		while(true)
		{
			dfs(0,pos);
			if(ans!=-1) break;
			deep++;
		}
		printf("%d\n",ans);
	}
	return 0;
}
GenBank是由美国国家生物技术信息中心(National Center for Biotechnology Information,NCBI)管理的一个全球性的DNA序列数据库。它是现代生物研究中最重要的资源之一。 GenBank数据库收集并保存了来自各种生物体的DNA序列数据。这些数据来源于科学家和研究机构提交的研究成果。每个DNA序列都有一个独特的GenBank入口编号,这个编号可以被其他研究者用来查找和引用相关的数据。 GenBank的DNA序列条目包含了许多重要的信息。首先是序列本身,这是DNA的碱基排列。这个序列可以通过ATCG这四个字母来表示,分别代表腺嘌呤、胸腺嘧啶、鸟嘌呤和胞嘧啶。此外,还有与序列相关的其他信息,如序列长度、注释、特殊特征等。 DNA序列条目中通常会提供有关该序列的相关研究或实验的详细描述。这些描述可能包括实验方法、数据分析结果、结论等。这些信息对于其他研究者来说是非常重要的,因为它们可以了解到相关研究的具体内容和结果。 GenBank的DNA序列条目还包含有关DNA样本来源、物种信息、以及提交者的联系方式等。这样,其他研究者可以与相关的实验室或作者联系,以获取更多的数据或进一步合作。 总之,GenBank的DNA序列条目提供了广泛的DNA序列数据和相关信息,为生物学和遗传学研究提供了重要的资源。通过查阅和使用这些数据,研究者们可以更深入地了解基因与生命活动之间的关系,为科学研究的发展做出贡献。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值