现在的位置: 首页 > 综合 > 正文

1080 Human Gene Functions

2014年01月15日 ⁄ 综合 ⁄ 共 1366字 ⁄ 字号 评论关闭

编辑距离问题,dp

类似最长公共子序列

f[i,j]=max{

f[i-1,j]+w(a[i],BLANK),  //a的i用空格匹配

f[i,j-1]+w(BLANK,b[j]),  //b的j用空格匹配

f[i-1,j-1]+w(a[i],b[j])        //a的i与b的j匹配

}

要注意dp的边界,即f的初值

f[0,0]=0

f[i,0]=f[i-1,0]+w(a[i],BLANK)

f[0,j]=f[0,j-1]+w(BLANK,b[j])

  1. //3504896_AC_0MS_468K
  2. #include<iostream>
  3. using namespace std;
  4. #define MAXN 101
  5. int l1,l2,i,j,t;
  6. char c;
  7. int f[MAXN][MAXN];
  8. int a[MAXN],b[MAXN];
  9. int w[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}};
  10. inline int max1(int x,int y)
  11. {
  12.     return x>y?x:y;
  13. }
  14. inline int Encode(int x)
  15. {
  16.     switch(x)
  17.     {
  18.     case 'A':return 0;
  19.     case 'C':return 1;
  20.     case 'G':return 2;
  21.     case 'T':return 3;
  22.     }
  23. }
  24. int main()
  25. {
  26.     //freopen("d:/in.txt","r",stdin);
  27.     cin>>t;
  28.     while(t--)
  29.     {
  30.         cin>>l1;
  31.         for(i=1;i<=l1;++i)
  32.         {
  33.             cin>>c;
  34.             a[i]=Encode(c);
  35.         }
  36.         cin>>l2;
  37.         for(i=1;i<=l2;++i)
  38.         {
  39.             cin>>c;
  40.             b[i]=Encode(c);
  41.         }
  42.         f[0][0]=0;
  43.         for(i=1;i<=l1;++i)
  44.         {
  45.             f[i][0]=f[i-1][0]+w[a[i]][4];
  46.         }
  47.         for(j=1;j<=l2;++j)
  48.         {
  49.             f[0][j]=f[0][j-1]+w[4][b[j]];
  50.         }
  51.         for(i=1;i<=l1;++i)
  52.         {
  53.             for(j=1;j<=l2;++j)
  54.             {
  55.                 f[i][j]=max1(f[i-1][j]+w[a[i]][4],max1(f[i][j-1]+w[4][b[j]],f[i-1][j-1]+w[a[i]][b[j]]));
  56.             }
  57.         }
  58.         cout<<f[l1][l2]<<endl;
  59.     }
  60.     return 0;
  61. }

抱歉!评论已关闭.