本文主要是介绍习题 3-7 DNA序列(DNA Consesus String) UVa 1368,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目大意:
给m个长度为n的DNA序列,求一个DNA序列到所有序列的总汉明距离最小,汉明距离为不同字符的位置的个数。如果有多个满足题意得序列则取字典序最小的那个。
Input
2
5 8
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
4 10
ACGTACGTAC
CCGTACGTAG
GCGTACGTAT
TCGTACGTAA
TAAGATAC
7
ACGTACGTAA
6
实现:
#include<stdio.h>
#include<string.h>
#define maxn 1005
int main(){int t;int m, n;char buf[maxn][maxn];int cnt;char a[maxn];int max[4];int T, A, G, C;int maxmum, index;int k;
// freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin);
// freopen("C:\\Users\\zhangwei\\Desktop\\output.txt","w",stdout); scanf("%d",&t);while(t--){cnt = 0;scanf("%d%d",&m,&n);for(int i = 0; i < m; i++ ){scanf("%s",buf[i]);}for(int j = 0; j < n; j++ ){memset(max, 0, sizeof(max));for(int i = 0; i < m; i++ ){if(buf[i][j] == 'A')max[0]++;if(buf[i][j] == 'C')max[1]++;if(buf[i][j] == 'G')max[2]++;if(buf[i][j] == 'T')max[3]++;maxmum = max[0];index = 0;for(k = 1; k < 4; k++){if(max[k] > maxmum){index = k;maxmum = max[k];}} } cnt += m-maxmum;//这里 可以直接算出 Hamming数量了 char c;if(index == 0) c = 'A';if(index == 1) c = 'C';if(index == 2) c = 'G';if(index == 3) c = 'T';a[j] = c;}a[n] = '\0';// 可以自己设定 '\0' (也可以按照字符数组来输出) 如果按照 %s 末尾必须 加\0printf("%s\n%d\n",a, cnt);
// 这是开始相当计算 Hamming值的方法 需要扫描 效率比较低
// for(int i = 0; i < m; i++ ){
// for(int j = 0; j < n; j++ ){
// if(buf[i][j] != a[j])
// cnt++;
// }
// }
// printf("%d\n",cnt);} return 0; }
- 从首地址开始逐字节寻址,把存储单元(一个字节)内的数据转换为相应数据应具有的的形式(如把二进制数转换为字符‘a’)
- 直到某一个字节内存的元素为字符'\0'时,输出此字符并且寻址结束。
这篇关于习题 3-7 DNA序列(DNA Consesus String) UVa 1368的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!