题解:DNA序列(UVa 1368)

  1. 题目链接:https://vjudge.net/problem/UVA-1368
  2. 解题思路:最优解中的第j个字母应该是输入中第j列的最多数量的字母;
  3. AC截图:
    题解:DNA序列(UVa 1368)_第1张图片
  4. AC代码:
#include
#include
char s[55][1005];
int num[5][1005];
char ans[1005];
char find[5]={'A','C','G','T'};
int main(){
    int T;scanf("%d",&T);
    while(T--){
        int m,n;scanf("%d%d",&m,&n);
        for(int i=0;i"%s",s[i]);
        }
        getchar();//吃掉缓冲区中的'\n'
        //for(int i=0;i
        //puts(s[i]);
        memset(num,0,sizeof(num));
        for(int j=0;jfor(int i=0;iswitch(s[i][j]){
                    case ('A'):num[0][j]++;break;
                    case ('C'):num[1][j]++;break;
                    case ('G'):num[2][j]++;break;
                    case ('T'):num[3][j]++;break;
                }
            }
        }//统计出各列(j表示列)中的ACGT各自的数量
        int count=0;
        for(int j=0;jint index=0;
            for(int i=0;i<4;i++){
                if(num[i][j]>num[index][j])index=i;
            }//找到某列j中的最多字母的下标
            ans[j]=find[index];//找到最优解字母
            count=count+(m-num[index][j]);//计算与该最优解不同的字母数目
        }
        ans[n]='\0';//手动添加字符结束符,便于使用puts输出
        puts(ans);printf("%d\n",count);
    }
} 

以上代码也许还不是很好或者解释中含有错误,欢迎朋友交流和分享更优秀的代码或对错误进行指出。

你可能感兴趣的:(算法竞赛入门经典-第2版)