nyoj246 Human Gene Functions dp
阿新 • • 發佈:2018-12-10
最長子序列變形,用dp[i][j]表示長度為i時的str1和長度為j的時str2的最大匹配值。 故dp[0][0]為0,但如果只有i或j為一個0時不一定為0,因為兩個序列的長度必須相等所以此時需要通過新增'-'實現。 當i,j都不為0時有三種情況:1.i用'-'填補。2.j用'-'填補。3.都不用'-'填補 ps:不存在都用'-'的情況。不然序列的長度都趨於無限了。 //這種方法新增'-'後怎麼確定str1和str2的長度一定相等這部分沒懂。
#include <bits/stdc++.h> #define maxn 105 using namespace std; char str1[maxn],str2[maxn]; int dp[maxn][maxn]; int matrix[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,-maxn, }; int f(char s){ switch(s){ case 'A':return 0; case 'C':return 1; case 'G':return 2; case 'T':return 3; case '-':return 4; } } int max(int a,int b,int c){ if(a>=b&&a>=c) return a; if(b>=a&&b>=c) return b; return c; } int main(){ int n; cin>>n; while(n--){ memset(dp,0,sizeof(dp)); int l1,l2; cin>>l1>>str1>>l2>>str2; dp[0][0]=0; for(int i=1;i<=l1;i++) dp[i][0]=dp[i-1][0]+matrix[f(str1[i-1])][f('-')]; for(int i=1;i<=l2;i++) dp[0][i]=dp[0][i-1]+matrix[f('-')][f(str2[i-1])]; int maxx=-maxn; for(int i=1;i<=l1;i++){ for(int j=1;j<=l2;j++){ int d1=dp[i-1][j]+matrix[f(str1[i-1])][f('-')]; int d2=dp[i][j-1]+matrix[f('-')][f(str2[j-1])]; int d3=dp[i-1][j-1]+matrix[f(str1[i-1])][f(str2[j-1])]; dp[i][j]=max(d1,d2,d3); } } cout<<dp[l1][l2]<<endl; } }