《算法竞赛入门经典》(第2版)——习题3-7 DNA序列(DNA Consensus String)

分析:读完题目后,你是不是可以发现,只要比较每一个DNA序列的相同位置上的字母就可以了,即我们要找的新序列,就是相应位置上,出现次数最多的那一只!比如说,每个序列的第一个字母中,A ,G, C,T出现的次数分别是6,1,1,1,那么,我们要找的新的序列的第一个字母就是A,如果有出现次数相同的,那就需要按字典序来决定选哪一只啦,具体看代码
传 代 码!威~武。。。

#include<stdio.h>
#include<string.h>
#define maxn1 55
#define maxn2 1005
char s[maxn1][maxn2];
int tot[4];
int main(){
	int m,n;
	scanf("%d %d",&m,&n);
	int i,j,k,l,tem,p;
	char d;
	char NDNA[maxn2];
	for(i=0;i<m;i++){ 
		scanf("%s",&s[i]);
	}	
	for(i=0;i<n;i++){//注意一下这两个for循环的顺序哦,不要弄反了
		char DNA[4]={'A','C','G','T'};//这里是解决问题的关键!注意我们每次定义这个字符数组的时候,位置就是按照字典序来排的 即A C G T
		memset(tot,0,sizeof(tot));
		for(j=0;j<m;j++){//来计算每个字母出现的次数,而且,数字的第一个表示的是A的次数,第二个是C的次数,一定要一一对应
			if(s[j][i]=='A')
				tot[0]++;
			if(s[j][i]=='C')
				tot[1]++;
			if(s[j][i]=='G')
				tot[2]++;
			if(s[j][i]=='T')
				tot[3]++;
		}
		for(k=0;k<4;k++){
			 //按照选择排序的方法,从到小排一下序
			tem=k;
			for(l=k+1;l<4;l++)
				if(tot[tem]<tot[l])//注意注意,这里是严格的小于,不能<=,这样才能按字典序哦
					tem=l;
			if(tem!=k){
				d=DNA[tem];DNA[tem]=DNA[k];DNA[k]=d;
			}
		}
		NDNA[i]=DNA[0];//每一次完成之后,都选出现次数最多的那一只
	}
	NDNA[i]='\0';
	printf("%s\n",NDNA);
	return 0;		
}

如果有不同的想法的,欢迎一起讨论鸭!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值