2つの文字列に対するグローバルアラインメントを、動的計画法によって行う。
2つの文字列に対するグローバルアラインメントを、動的計画法によって行う。
#include<stdio.h>#include<string.h>#define SMAX 64#define MATCH 2#define UNMATCH -1#define GAP -1int main(void){char str1[] = "ATGCGGATTCAGAT";char str2[] = "ATGATCCGT";char str3[2*SMAX];char str4[2*SMAX];int m[SMAX][SMAX];int w, h, i, j, k;// 初期化w = strlen(str1) + 1;h = strlen(str2) + 1;for(i = 0; i < w; i++){m[i][0] = 0;}for(j = 0; j < h; j++){m[0][j] = 0;}// 動的計画法によるアラインメントfor(j = 1; j < h; j++){for(i = 1; i < w; i++){int s = (str1[i-1] == str2[j-1]) ? MATCH : UNMATCH;int max = m[i-1][j-1] + s;if(max < m[i-1][j] + GAP){max = m[i-1][j] + GAP;}else if(max < m[i][j-1] + GAP){max = m[i][j-1] + GAP;}m[i][j] = max;}}// スコア出力for(j = 0; j < h; j++){for(i = 0; i < w; i++){printf("%2d ", m[i][j]);}puts("");}// トレースバックi = w - 1;j = h - 1;k = SMAX - 1;str3[k] = '';str4[k] = '';while( !(i == 0 && j == 0) ){int s = (str1[i-1] == str2[j-1]) ? MATCH : UNMATCH;if(m[i-1][j-1] + s == m[i][j]){k--;str3[k] = str1[--i];str4[k] = str2[--j];}else if(m[i-1][j] + GAP == m[i][j] || j == 0){k--;str3[k] = str1[--i];str4[k] = '_';}else if(m[i][j-1] + GAP == m[i][j] || i == 0){k--;str3[k] = '_';str4[k] = str2[--j];}}// 結果出力puts(&str3[k]);puts(&str4[k]);return 0;}