[关闭]
@Moritz 2019-03-26T04:32:43.000000Z 字数 1230 阅读 463

Exercises in Chapter 3 数组和字符串

aoapc_2nd C++ 编程 所有文稿


3-7: DNA序列

DNA Consensus String, ACM/ICPC Seoul 2006, UVa1368

  1. #include <iostream>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <cmath>
  5. using namespace std;
  6. /*
  7. 8 5
  8. TATGATAC
  9. TAAGCTAC
  10. AAAGATCC
  11. TGAGATAC
  12. TAAGATGT
  13. */
  14. int main()
  15. {
  16. int m,n;
  17. scanf("%d%d",&m,&n);
  18. string dna[55];
  19. int hu[55];
  20. memset(hu,0,sizeof(hu));
  21. for(int i=1;i<=n;i++) cin>>dna[i];
  22. for(int i=1;i<=n;i++)
  23. {
  24. int tot=0;
  25. for(int j=0;j<m;j++)
  26. {
  27. for(int k=1;k<n;k++)
  28. {
  29. if (dna[i][j]!=dna[(i+k)%5][j]) tot++;
  30. }
  31. }
  32. hu[i]=tot;
  33. }
  34. //for(int i=1;i<=n;i++) cout<<hu[i];
  35. cout<<endl;
  36. int mi=1;
  37. for(int i=2;i<n;i++)
  38. {
  39. if (hu[i]<hu[mi]||(hu[i]==hu[mi]&&dna[i]<dna[mi])) mi=i;
  40. }
  41. cout<<mi<<endl<<dna[mi];
  42. return 0;
  43. }

网上参考做法(github代码库里只有1-6题)

  1. #include<bits/stdc++.h>
  2. #define _for(i,a,b) for(int i=(a);i<(b);++i)//for循环的一种简单写法的宏定义
  3. using namespace std;
  4. int main(){
  5. int T,m,n;
  6. scanf("%d",&T);
  7. while(T--){
  8. scanf("%d%d",&m,&n);
  9. string input[m];
  10. _for(i,0,m) cin>>input[i];//读入m个字符串
  11. map<char,int>um;//存储m个字符串中相同位置出现的字符及其对应的次数,注意map按键有小到大的顺序存储
  12. int error=0;//存储Hamming距离和
  13. _for(i,0,n){
  14. _for(j,0,m) ++um[input[j][i]];
  15. char MAX='A';
  16. for(auto&j:um)//查找出现次数最多的字符
  17. if(j.second>um[MAX])
  18. MAX=j.first;
  19. putchar(MAX);//输出出现次数最多的字符
  20. error+=m-um[MAX];//加上Hamming距离
  21. um.clear();//清空map
  22. }
  23. printf("\n%d\n",error);//输出Hamming距离和
  24. }
  25. return 0;
  26. }

直接取该列出现次数最高的字符,若并不存在一个序列包含了所有频次最高的字符呢? -2019.2.21

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注