|
思路:
由于上下都可以加空格,这个有点崩溃。 但后来发现还是可以用动态规划做的。 假设输入的字符串分别为 A,B f[i][j] = { 从 A[i] 和 B[j] 开始匹配,所能达到的最大值 } 假设 A[i] = G,B[j] = C 那么现在的情况就是 Gxxxxx Cxxxxx 状态转移为 => f[i + 1][j] + table(A[i], '-') G... -C..
=> f[i][j + 1] + table(B[j], '-') -G.. C...
=> f[i + 1][j + 1] + table(A[i], B[j]) G... C...
可以用滚动数组。
所以这样就解决了,觉得很神奇。
#include <stdio.h>

int N, M, f[2][256], *pre, *cur;
char A[256], B[256], map[256];
 int tbl[5][5] = {
 { 5, -1, -2, -1, -3},
 {-1, 5, -3, -2, -4},
 {-2, -3, 5, -2, -2},
 {-1, -2, -2, 5, -1},
 {-3, -4, -2, -1, 0},
};

inline void swap(int **a, int **b)
  {
int *t = *a;
*a = *b;
*b = t;
}

inline int max(int a, int b)
  {
return a > b ? a : b;
}

inline int min(int a, int b)
  {
return a < b ? a : b;
}

inline int dif(char a, char b)
  {
return tbl[map[a]][map[b]];
}

int main()
  {
int t, i, j;
freopen("e:\\test\\in.txt", "r", stdin);

map['A'] = 0;
map['C'] = 1;
map['G'] = 2;
map['T'] = 3;
map['-'] = 4;
scanf("%d", &t);
 while (t--) {
scanf("%d%s%d%s", &N, &A[1], &M, &B[1]);
pre = &f[0][0];
cur = &f[1][0];
cur[0] = 0;
for (i = 1; i <= M; i++)
cur[i] = dif(B[i], '-') + cur[i - 1];
 for (i = 1; i <= N; i++) {
swap(&pre, &cur);
cur[0] = dif(A[i], '-') + pre[0];
 for (j = 1; j <= M; j++) {
cur[j] = dif(A[i], B[j]) + pre[j - 1];
cur[j] = max(cur[j], dif(A[i], '-') + pre[j]);
cur[j] = max(cur[j], dif(B[j], '-') + cur[j - 1]);
}
}
printf("%d\n", cur[M]);
}
}

|