ZOJ 1027

来源:互联网 发布:java swing 时间控件 编辑:程序博客网 时间:2024/05/17 09:31

又经典的DP题LCS改编

原来的LCS是求最长公共子序列

这里把长度换成了权重

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <cstdio>
  4. using namespace std;
  5. const int MAXN = 101;
  6. const int MAX = 99999999;
  7. const int point[5][5] = {{5, -1, -2, -1, -3}, {-1, 5, -3, -2, -4}, {-2, -3, 5, -2, -2},
  8. {-1, -2, -2, 5, -1}, {-3, -4, -2, -1, 0}};
  9. int f[MAXN][MAXN], data[2][MAXN], num[2];
  10. int main()
  11. {
  12.     int cases;
  13.     cin>>cases;
  14.     while (cases--)
  15.     {
  16.         int i,j;
  17.         for (i = 0; i < 2; i ++)
  18.         {
  19.             scanf("%d",num+i);getchar();
  20.             char ch;
  21.             for (j = 0; j < num[i]; j++)
  22.             {
  23.                 ch = getchar();
  24.                 switch (ch)
  25.                 {
  26.                 case 'A':
  27.                     data[i][j] = 0;
  28.                     break;
  29.                 case 'C':
  30.                     data[i][j] = 1;
  31.                     break;
  32.         
  33.                 case 'G':
  34.                     data[i][j] = 2;
  35.                     break;
  36.                
  37.                 case 'T':
  38.                     data[i][j] = 3;
  39.                     break;
  40.                
  41.                 }
  42.             }
  43.         }
  44.             int u,v;
  45.             for (u = 0; u < MAXN; u++ )
  46.                 for (v = 0; v < MAXN; v++)
  47.                     f[u][v] = -MAX;
  48.             f[0][0] = 0;
  49.             for (u = 0; u <= num[0]; ++u)
  50.             {
  51.                 for (v = 0; v <= num[1]; ++v)
  52.                 {
  53.                     if (f[u+1][v+1] < f[u][v] + point[data[0][u]][data[1][v]])
  54.                         f[u+1][v+1] = f[u][v] + point[data[0][u]][data[1][v]];
  55.                     if (f[u][v+1] < f[u][v] + point[4][data[1][v]])
  56.                         f[u][v+1] = f[u][v] + point[4][data[1][v]];
  57.                     if (f[u+1][v] < f[u][v] + point[data[0][u]][4])
  58.                         f[u+1][v] = f[u][v] + point[data[0][u]][4];
  59.                 }
  60.             }
  61.             cout<<f[num[0]][num[1]]<<endl;
  62.         
  63.     
  64.     }
  65.             
  66.     return 0;
  67. }
原创粉丝点击