2つの文字列に対するグローバルアラインメントを、動的計画法によって行う。
2つの文字列に対するグローバルアラインメントを、動的計画法によって行う。
#include<stdio.h> #include<string.h> #define SMAX 64 #define MATCH 2 #define UNMATCH -1 #define GAP -1 int 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; }