标签:style blog color io strong for ar div
题目大意:给出两个字符串,要使他们对齐,比如: AGTGATG GTTAG 这两个字符串可以看成是
AGTGATG
-GTTA-G 也可以看成是
AGTGAT
-G-GT--TAG 然后每个对齐的字母去查表可以得到他们的值 问怎么对齐可以得到所有值的和的最大值
LCS的变形而已
注意LCS的子串可以是离散的,不必连续,用动态规划
c[i][j]=max( c[i-1][j-1]+value(a[i],b[j]), c[i][j-1]+value(‘-‘,b[j]), c[i-1][j]+value(a[i],‘-‘) ) 这里的I,J表示前面I,J的各个可能的匹配情况 #include<cstdio> #include<cstring> int cmpmax(int a,int b) { int c=a>b?a:b; return c; } int match1(char a,char b) { if(a==‘A‘) { if(b==‘A‘) return 5; if(b==‘C‘) return -1; if(b==‘G‘) return -2; if(b==‘T‘) return -1; if(b==‘-‘) return -3; } if(a==‘C‘) { if(b==‘A‘) return -1; if(b==‘C‘) return 5; if(b==‘G‘) return -3; if(b==‘T‘) return -2; if(b==‘-‘) return -4; } if(a==‘G‘) { if(b==‘A‘) return -2; if(b==‘C‘) return -3; if(b==‘G‘) return 5; if(b==‘T‘) return -2; if(b==‘-‘) return -2; } if(a==‘T‘) { if(b==‘A‘) return -1; if(b==‘C‘) return -2; if(b==‘G‘) return -2; if(b==‘T‘) return 5; if(b==‘-‘) return -1; } if(a==‘-‘) { if(b==‘A‘) return -3; if(b==‘C‘) return -4; if(b==‘G‘) return -2; if(b==‘T‘) return -1; } } int match2(char a) { if(a==‘A‘) return -3; if(a==‘C‘) return -4; if(a==‘G‘) return -2; if(a==‘T‘) return -1; } int main() { int l1,l2,i,j,num,s1,s2; char a[103],b[103]; int s[103][103]; scanf("%d",&num); while(num--) { scanf("%d",&l1); scanf("%c",&a[1]); for(i=1;i<=l1;i++) scanf("%c",&a[i]); scanf("%d",&l2); scanf("%c",&b[1]); for(i=1;i<=l2;i++) scanf("%c",&b[i]); memset(s,0,sizeof(s)); s[0][0]=0; int temp; for(i=1;i<=l1;i++) s[i][0]=s[i-1][0]+match2(a[i]); //之前的代码是s[i][0]=match2(a[i]);一直不对,因为没有考虑前面i-1的字符匹配结果 for(i=1;i<=l2;i++) s[0][i]=s[0][i-1]+match2(b[i]); for(i=1;i<=l1;i++) for(j=1;j<=l2;j++) { if(a[i]==b[j])//相等时匹配值为5 s[i][j]=s[i-1][j-1]+5; else { s1=match2(a[i]); s2=match2(b[j]); temp=cmpmax(s[i-1][j]+s1,s[i][j-1]+s2); s[i][j]=cmpmax(temp,s[i-1][j-1]+match1(a[i],b[j])); } } printf("%d\n",s[l1][l2]); } return 1; }
标签:style blog color io strong for ar div
原文地址:http://www.cnblogs.com/notlate/p/3909664.html