题目传送:Human Gene Functions
思路:LCS的变形,定义状态dp[ i ][ j ]为取字符串s前i个字符字符串t前j个字符所获得的最大值,则可以得到状态转移方程为:
dp[ i ][ j ] = max(dp[ i ][ j - 1] + f[ ' - ' ][ t[ j ] ], dp[ i - 1 ][ j ] + f[ s [ i ] ][ ' - ' ], dp[i - 1][ j - 1] + f[ s [ i ] ][ t [ j ] ]);
AC代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <deque>
#include <cctype>
#define LL long long
#define INF 0x7fffffff
using namespace std;
char s[105];
char t[105];
int len1, len2;
int f[105][105];
int dp[105][105];
void init() {
f['A']['A'] = 5; f['A']['C'] = -1; f['A']['G'] = -2; f['A']['T'] = -1; f['A']['-'] = -3;
f['C']['A'] = -1; f['C']['C'] = 5; f['C']['G'] = -3; f['C']['T'] = -2; f['C']['-'] = -4;
f['G']['A'] = -2; f['G']['C'] = -3; f['G']['G'] = 5; f['G']['T'] = -2; f['G']['-'] = -2;
f['T']['A'] = -1; f['T']['C'] = -2; f['T']['G'] = -2; f['T']['T'] = 5; f['T']['-'] = -1;
f['-']['A'] = -3; f['-']['C'] = -4; f['-']['G'] = -2; f['-']['T'] = -1;
}
int main() {
init();
int T;
scanf("%d", &T);
while(T --) {
scanf("%d %s", &len1, s + 1);
scanf("%d %s", &len2, t + 1);
dp[0][0] = 0;
for(int i = 1; i <= len1; i ++) {
dp[i][0] = dp[i-1][0] + f[s[i]]['-'];
}
for(int i = 1; i <= len2; i ++) {
dp[0][i] = dp[0][i-1] + f['-'][t[i]];
}
for(int i = 1; i <= len1; i ++) {
for(int j = 1; j <= len2; j ++) {
int t1 = dp[i][j-1] + f['-'][t[j]];
int t2 = dp[i-1][j] + f[s[i]]['-'];
int t3 = dp[i-1][j-1] + f[s[i]][t[j]];
dp[i][j] = max(t1, max(t2, t3));
}
}
cout << dp[len1][len2] << endl;
}
return 0;
}