题目传送: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; }
POJ - 1080 - Human Gene Functions (LCS的变形)
原文地址:http://blog.csdn.net/u014355480/article/details/45488765