POJ 1080 Human Gene Functions
最长公共子串的变形题。
要初始化第一行第一列。
下面是代码:
#include <stdio.h> int max(int a,int b,int c) { if(a<b) { a=b; } if(a<c) { a=c; } return a; } int find(char c1,char c2) { if(c1==c2) { return 5; } else if(c1=='A'&&c2=='C') { return -1; } else if(c1=='A'&&c2=='G') { return -2; } else if(c1=='A'&&c2=='T') { return -1; } else if(c1=='A'&&c2=='-') { return -3; } else if(c1=='C'&&c2=='A') { return -1; } else if(c1=='C'&&c2=='G') { return -3; } else if(c1=='C'&&c2=='T') { return -2; } else if(c1=='C'&&c2=='-') { return -4; } else if(c1=='G'&&c2=='A') { return -2; } else if(c1=='G'&&c2=='C') { return -3; } else if(c1=='G'&&c2=='T') { return -2; } else if(c1=='G'&&c2=='-') { return -2; } else if(c1=='T'&&c2=='A') { return -1; } else if(c1=='T'&&c2=='C') { return -2; } else if(c1=='T'&&c2=='G') { return -1; } else if(c1=='T'&&c2=='-') { return -1; } else if(c1=='-'&&c2=='A') { return -3; } else if(c1=='-'&&c2=='C') { return -4; } else if(c1=='-'&&c2=='G') { return -2; } else if(c1=='-'&&c2=='T') { return -1; } return 0; } int main() { int dp[105][105],t; scanf("%d",&t); int len1 ,len2,i,j; char s1[105],s2[105]; while(t--) { scanf("%d%s%d%s",&len1,s1,&len2,s2); dp[0][0]=0; for(i=0;i<len1;i++) { dp[i+1][0]=dp[i][0]+find(s1[i],'-'); } for(i=0;i<len2;i++) { dp[0][i+1]=dp[0][i]+find('-',s2[i]); } for(i=0;i<len1;i++) { for(j=0;j<len2;j++) { dp[i+1][j+1]=max(dp[i+1][j]+find('-',s2[j]),dp[i][j]+find(s1[i],s2[j]),dp[i][j+1]+find(s1[i],'-')); } } printf("%d\n",dp[len1][len2]); } return 0; }