本题一看就知道是一道动归,其实和字串距离非常的像,只不过多了题目规定的匹配相似度罢了。
PS:换行效果更佳。
然后直接在主函数中调用即可
其中s1,s2均为读入的字符串,我们把它们分别逐字符转化放入a,b数组。
然后就是关键的动归核心部分了。
首先,看到数据范围:100
受到启发:二位数组开的起,再加上字串距离的引导,我们很容易想到f[i][j]f[i][j]f[i][j]可以表示第一个字符串的前i个字符与第二个字符串的前j个字符匹配的最大值。
状态想出来,那么方程如何转移呢?
根据可以加入空碱基,我们能想到
f[i][j]=max(f[i][j],f[i−1][j]+shuzu[a[i]][5],f[i][j−1]+shuzu[b[j]][5],f[i−1][j−1]+shuzu[a[i]][b[i]]f[i][j]=max(f[i][j],f[i-1][j]+shuzu[a[i]][5],f[i][j-1]+shuzu[b[j]][5],f[i-1][j-1]+shuzu[a[i]][b[i]]f[i][j]=max(f[i][j],f[i−1][j]+shuzu[a[i]][5],f[i][j−1]+shuzu[b[j]][5],f[i−1][j−1]+shuzu[a[i]][b[i]] 分别是s1串的最后一个字符对应一个空字符,s2串的最后一个字符对应一个空字符,s1串个s2串的最后一个字符直接对应。
显而易见的,初始化f数组就是
for(int i=1;i<=n;i++)f[i][0]=f[i-1][0]+shuzu[a[i]][5]; for(int i=1;i<=m;i++)f[0][i]=f[0][i-1]+shuzu[b[i]][5];然后把它们拼凑起来,就完工喽!
完结撒花~
转载于:https://www.cnblogs.com/vercont/p/10210069.html
相关资源:JAVA上百实例源码以及开源项目