一道动态规划,两个串进行匹配,不同字母匹配的值不一样,也可以和空格匹配(空格不能与空格匹配),求最大的匹配值。
数据很弱,每个串都在100以内。
定义dp[i][j]为第一个串前i个数和第二个串前j个数已匹配的匹配值
有三种情况:1.第i个和第j个匹配
2.第i个和‘-’匹配
3.第j个和‘-’匹配
注意合理初始化
#include<cstdio> #include<algorithm> #include<cmath> #include<map> #include<iostream> #include<cstring> using namespace std; int g[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,0}}; char str1[105]; char str2[105]; map<char,int> m; int cas; int dp[105][105];//前i个数和前j个数已匹配的情况 int main() { // freopen("input.txt","r",stdin); int len1,len2; scanf("%d",&cas); m['A']=0; m['C']=1; m['G']=2; m['T']=3; m['-']=4; while(cas--) { scanf("%d%s",&len1,str1); scanf("%d%s",&len2,str2); dp[0][0]=0; for(int i=1;i<=len1;i++) dp[i][0]=dp[i-1][0]+g[m[str1[i-1]]][4]; for(int i=1;i<=len2;i++) dp[0][i]=dp[0][i-1]+g[4][m[str2[i-1]]]; for(int i=1;i<=len1;i++) for(int j=1;j<=len2;j++) { int t1=dp[i-1][j-1]+g[m[str1[i-1]]][m[str2[j-1]]]; int t2=dp[i-1][j]+g[m[str1[i-1]]][4]; int t3=dp[i][j-1]+g[4][m[str2[j-1]]]; dp[i][j]=max(t1,max(t2,t3)); } printf("%d ",dp[len1][len2]); } }