poj 1080 Human Gene Functions dp

来源:互联网 发布:aes256算法 java实现 编辑:程序博客网 时间:2024/05/21 10:23
这个题目也没什么可以说的了
dp[i][j]表示第一段长度为i,第二段长度为j的时候的最优值
状态转移方程
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+mat[a[i]][b[j]]);
dp[i][j]=max(dp[i][j],dp[i-1][j]+mat[a[i]][0]);
dp[i][j]=max(dp[i][j],dp[i][j-1]+mat[0][b[j];
注意边界就ok了

#include
#include
#include
using namespace std;
const int maxn=111,inf=99999999;
char a[maxn],b[maxn];
int mat[501][501];
int dp[maxn][maxn];
const char A='A',G='G',T='T',C='C';

int max(int a,int b)
{
    if(a>b)return(a);
    return(b);
}

int main()
{
    int tcase;
   scanf("%d",&tcase);
   mat[A][A]=mat[C][C]=mat[T][T]=mat[G][G]=5;
   mat[A][C]=mat[C][A]=-1;
   mat[A][T]=mat[T][A]=-1;
   mat[A][G]=mat[G][A]=-2;
   mat[A][0]=mat[0][A]=-3;
   mat[C][G]=mat[G][C]=-3;
   mat[C][T]=mat[T][C]=-2;
   mat[C][0]=mat[0][C]=-4;
   mat[G][T]=mat[T][G]=-2;
   mat[G][0]=mat[0][G]=-2;
   mat[T][0]=mat[0][T]=-1;


    while(tcase--)
    {
       memset(a,0,sizeof(a));
       memset(b,0,sizeof(b));
       int n,m;
       scanf("%d %s %d%s",&n,&a[1],&m,&b[1]);
       dp[0][0]=0;
       for(int i=1;i<=n;i++)
       dp[i][0]=mat[a[i]][0]+dp[i-1][0];
       for(int i=1;i<=m;i++)
       dp[0][i]=mat[b[i]][0]+dp[0][i-1];
       dp[1][1]=mat[a[1]][b[1]];

       for(int i=1;i<=n;i++)
       for(int j=1;j<=m;j++)
       {
          dp[i][j]=-inf;
          dp[i][j]=max(dp[i][j],dp[i-1][j-1]+mat[a[i]][b[j]]);
          dp[i][j]=max(dp[i][j],dp[i-1][j]+mat[a[i]][0]);
          dp[i][j]=max(dp[i][j],dp[i][j-1]+mat[0][b[j]]);
       }



       printf("%d\n",dp[n][m]);
    }
    return 0;
}

原创粉丝点击