Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 17610 | Accepted: 9821 |
Description
Input
Output
Sample Input
2 7 AGTGATG 5 GTTAG 7 AGCTATT 9 AGCTTTAAA
Sample Output
14 21
题意:求两基因的相似度,先要在每个基因对中加入若干空格,然后再依次加上匹配度,详见上表,则相似度就是最大的匹配度和(语文不好,这段百度抄的。。)
lcs变种,dp[i][j]=max{dp[i-1][j-1]+sco[i][j],dp[i-1][j]+sco[s1[i]][‘ ‘],dp[i][j-1]+sco[‘ ‘][sco[s2[i]]}
上面括号内的三个式子,第一个容易理解,就不解释了,第二个,如果让s2[j]和s1[i-1]匹配,则只能在s2[j]之后补空格,让s1[i]和空格匹配,而dp[i-1][j]是已经计算好的结果,所以不用管s2[j-1]和谁匹配,这就是第二个式子,第三个式子同理
还有一点需要注意的就是初始化,dp[0][0]=0,dp[0][i]这是在是s1[0]和s2[i]匹配时在s1[0]前面补空格之后的结果,由于是第一次算而不是利用已经算出的结果,所以必须算出来,注意并不是0,
可以直接利用状态转移方程dp[0][i]=dp[0][i-1]+sco[‘ ‘][sco[s2[i]]
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> #include<stdlib.h> using namespace std; const int maxn=1010; const int INF=(1<<28); int T; int n1,n2; int s1[maxn],s2[maxn]; int sco[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,-INF }; int dp[maxn][maxn]; int t[maxn]; int max3(int a,int b,int c) { if(b>a) a=b; if(c>a) a=c; return a; } int main() { cin>>T; t[‘A‘]=0; t[‘C‘]=1; t[‘G‘]=2; t[‘T‘]=3; t[‘ ‘]=4; while(T--){ char ch; cin>>n1; for(int i=1;i<=n1;i++){ cin>>ch; s1[i]=t[ch]; } cin>>n2; for(int i=1;i<=n2;i++){ cin>>ch; s2[i]=t[ch]; } dp[0][0]=0; for(int i=1;i<=n1;i++){ //注意初始化,0前面补空格才得到dp[0][i] dp[i][0]=dp[i-1][0]+sco[s1[i]][4]; } for(int i=1;i<=n2;i++){ dp[0][i]=dp[0][i-1]+sco[s2[i]][4]; } for(int i=1;i<=n1;i++){ for(int j=1;j<=n2;j++){ dp[i][j]=max3(dp[i-1][j-1]+sco[s1[i]][s2[j]],dp[i-1][j]+sco[s1[i]][4],dp[i][j-1]+sco[4][s2[j]]); } } cout<<dp[n1][n2]<<endl; } return 0; }
原文:http://www.cnblogs.com/--560/p/4354598.html