UVA-1368 DNA Consensus String (贪心)

Posted keximeiruguo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

 

以上是关于UVA-1368 DNA Consensus String (贪心)的主要内容,如果未能解决你的问题,请参考以下文章

UVa 1368 - DNA Consensus String

DNA Consensus String UVA - 1368

UVA-1368 DNA Consensus String (贪心)

算法竞赛入门经典(第二版)3-7DNA序列UVA1368

DNA序列(DNA Consensus String)

DNA序列(DNA Consensus String)