zoukankan      html  css  js  c++  java
  • 洛谷P1140 相似基因

    题目:https://www.luogu.org/problemnew/show/P1140

    分析:

    本题一看就知道是一道动归,其实和字串距离非常的像,只不过多了题目规定的匹配相似度罢了。

    匹配的相似度我们之间用一个二维数组读入即可

    int shuzu[6][6]={{0,0,0,0,0,0},{0,5,-1,-2,-1,-3},{0,-1,5,-3,-2,-4},{0,-2,-3,5,-2,-2},{0,-1,-2,-2,5,-1},{0,-3,-4,-2,-1,0}};
    

    PS:换行效果更佳。

    然后要把字符串转化成刚才数组中的下标,便于读写

    int start(char c)
    {
    	if(c=='A')return 1;
    	if(c=='C')return 2;
    	if(c=='G')return 3;
    	if(c=='T')return 4;
    }
    

    然后直接在主函数中调用即可

    之后就是调用问题

    for(int i=0;i<n;i++)
    	{
    		a[i+1]=start(s1[i]);
    	}
    	for(int j=0;j<m;j++)
    	{
    		b[j+1]=start(s2[j]);
    	}
    

    其中s1,s2均为读入的字符串,我们把它们分别逐字符转化放入a,b数组。

    然后由于有负值出现,我们需要把动归的核心方程初始化为一个极小的负数

    for(int i=1;i<=n;i++)
    	{
    		for(int j=1;j<=m;j++)
    		{
    			f[i][j]=-2147483647;
    		}
    	}
    

    然后就是关键的动归核心部分了。

    首先,看到数据范围:100

    受到启发:二位数组开的起,再加上字串距离的引导,我们很容易想到f[i][j]f[i][j]可以表示第一个字符串的前i个字符与第二个字符串的前j个字符匹配的最大值。

    状态想出来,那么方程如何转移呢?

    根据可以加入空碱基,我们能想到

    f[i][j]=max(f[i][j],f[i1][j]+shuzu[a[i]][5],f[i][j1]+shuzu[b[j]][5],f[i1][j1]+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];
    

    然后把它们拼凑起来,就完工喽!

    完结撒花~

  • 相关阅读:
    springMVC和Struts2的区别
    Java并发教程(Oracle官方资料)
    Java并发教程(Oracle官方资料)
    Perl 按地区统计访问次数
    Perl 多个正则匹配
    Perl 判断字符串为空
    Java中的大小写字母相互转换(不利用Java自带的方法)
    如何利用JavaScript遍历JSON数组
    javax.servlet.JspTagException:Illegal use of -style tag without as its di
    PERL get网页
  • 原文地址:https://www.cnblogs.com/vercont/p/10210069.html
Copyright © 2011-2022 走看看