UVA-1368 DNA Consensus String (贪心)

 

 这种线性最值问题一般不是贪心就是动归

应该是道贪心题,因为每一列的值与其他列没有什么关系(这是判断贪心问题的根本大法),对于每一列找出使其Hamming距离最小的值即可,由于此题只要值相同就是0,值不同就是1,没有远近之分,所以每一个值都是原来出现次数最多的值。

一定注意出现多解的时候如何选择!!!!此题就被坑了,一定注意此题是输出字典序最小的!!!

 1 #include "bits/stdc++.h"
 2 using namespace std;
 3 const int MAX=1005;
 4 int t,n,m,ans;
 5 char s[55][MAX],as[MAX];
 6 struct Cha{
 7     char c;
 8     int num;
 9     bool operator < (Cha &tt) const {
10         return num<tt.num;
11     }
12 }a[5],an;
13 int main(){
14     freopen ("string.in","r",stdin);
15     freopen ("string.out","w",stdout);
16     int i,j;
17     scanf("%d",&t);
18     a[1].c='A',a[2].c='T',a[3].c='C',a[4].c='G';
19     while (t--){
20         ans=0;
21         scanf("%d%d",&n,&m);
22         for (i=1;i<=n;i++) scanf("%s",s[i]+1);
23         for (i=1;i<=m;i++){
24             a[1].num=a[2].num=a[3].num=a[4].num=0;
25             for (j=1;j<=n;j++){
26                 if (s[j][i]=='A') a[1].num++;
27                 if (s[j][i]=='T') a[2].num++;
28                 if (s[j][i]=='C') a[3].num++;
29                 if (s[j][i]=='G') a[4].num++;
30             }
31             an=a[1];
32             if (an<a[3]) an=a[3];
33             if (an<a[4]) an=a[4];
34             if (an<a[2]) an=a[2];
35             as[i]=an.c;
36             ans+=n-an.num;
37         }
38         for (i=1;i<=m;i++)
39             printf("%c",as[i]);
40         printf("
%d
",ans);
41     }
42     return 0;
43 }

DNA Consensus String

 

原文地址:https://www.cnblogs.com/keximeiruguo/p/13860580.html