(1) a[1000][4] : 统计n列AGCT字符出现的个数,
maxnum[1000] : 记录n列中字符出现频率最高的那个字符的个数
charOfmaxnum[1000] : 记录n列中字符出现频率最高的那个字符
(2) 最优DNA序列与其他序列对比, 错误字符统计个数方法:
由于maxnum[1000]已经事先统计好了, 所以:
第一列 : 错误字符的个数为 n - maxnum[0]
第二列: 错误字符的个数为 n - maxnum[1]
.......
第n列: 错误字符的个数为 n - maxnum[n-1]
最终, 错误字符总数为 sum( n - maxnum[i] ) , i = 0, 1, 2 ....n
#include
#include
using namespace std;
int a[1000][4]; //1000对应m 4对应AGCT
int value(char c) //方便计数到数组a, a[i]][0]: 'A'在第i列出现的次数,a[i]][1]: 'C'在第i列出现的次数...
{
if(c == 'A') return 0;
if(c == 'C') return 1;
if(c == 'G') return 2;
return 3;
}
int main(int argc, char *argv[])
{
int T, m, n, sum;
cin>>T;
int maxnum[1000];//存储n列中AGCT字符数量中的最大值
char charOfmaxnum[1000]; //最大数量对应的字符
while(T--)
{
memset(a, 0, sizeof(a));
memset(maxnum, 0, sizeof(maxnum));
cin>>m>>n; //m是DNA序列数, n是序列宽度
getchar(); //换行符
int t,c;
/* 1. 统计字符并计数 */
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
c = getchar();
t = ++a[j][value(char(c))];
if(t > maxnum[j] ||(t == maxnum[j] && charOfmaxnum[j] > char(c))) // 出现频率更高的字符便记录下来
{
maxnum[j] = t;
charOfmaxnum[j] = char(c);
}
}
getchar(); //换行符
}
/* 2. 统计错误字符个数并输出 */
sum = 0; //错误字符的个数
for(int i = 0; i < n; i++)
{
sum += m - maxnum[i];
cout<