zoukankan      html  css  js  c++  java
  • hdu 1080 Human Gene Functions 夜

    二维DP

    先把四种字符映射成整数 空格为 4  然后将对应的相似程度值存入

    sim 数组中以便查找

    ans[i][j] 表示 a 中第 i 个与 b 中第 j 个为最后时的最大相似程度值

    其中包括 a[i] 与 b[j]成对 a[i]与 空格成对 空格与b[j]成对三种情况

    要取最大的一种情况

    以 0 0 为截止点

    http://acm.hdu.edu.cn/showproblem.php?pid=1080

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    #include<math.h>

    using namespace std;

    int sim[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};
    int ans[101][101];
    char s[102];
    int a[102];
    int b[102];
    int dp(int i,int j)
    {
        if(ans[i][j]!=-1)//已计算出
        return ans[i][j];
        if(!i&&!j)//截止情况
        {
            ans[i][j]=0;
            return ans[i][j];
        }
        if(!i)
        {
           ans[i][j]=dp(i,j-1)+sim[4][b[j]];
           return ans[i][j];
        }
        if(!j)
        {
            ans[i][j]=dp(i-1,j)+sim[a[i]][4];
            return ans[i][j];
        }
        if(i>0&&j>0)//重点在这里哟 亲
        {
            ans[i][j]=max(sim[a[i]][b[j]]+dp(i-1,j-1),max(sim[a[i]][4]+dp(i-1,j),sim[4][b[j]]+dp(i,j-1)));
            return ans[i][j];
        }

    }
    int main()
    {

        //freopen("D:\\6\\bin\\Debug\\hu.txt","r",stdin );

        int T,n,m,i;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            scanf("%s",s);
            for(i=0;i<n;i++)
            if(s[i]=='A')
            {
                a[i+1]=0;
            }else if(s[i]=='C')
            {
                a[i+1]=1;
            }else if(s[i]=='G')
            {
                a[i+1]=2;
            }else
            {
                a[i+1]=3;
            }
            scanf("%d",&m);
            scanf("%s",s);
            for(i=0;i<m;i++)
            if(s[i]=='A')
            {
                b[i+1]=0;
            }else if(s[i]=='C')
            {
                b[i+1]=1;
            }else if(s[i]=='G')
            {
                b[i+1]=2;
            }else
            {
                b[i+1]=3;
            }
            memset(ans,-1,sizeof(ans));
            printf("%d\n",dp(n,m));
        }
        return 0;
    }

  • 相关阅读:
    Project项目视图
    Console(控制台视图)
    Layout布局列表
    Layers层列表
    帐户下拉
    TransformGizmo(变换)切换
    Play播放控件
    变换工具
    工具栏
    Help帮助
  • 原文地址:https://www.cnblogs.com/liulangye/p/2266698.html
Copyright © 2011-2022 走看看