zoukankan      html  css  js  c++  java
  • POJ1080Human Gene Functions(LCS变形)

    题目链接

    题目:给出两个串,每匹配一种有一种权值,求权值最大的匹配串

    就是 最长公共子序列的 的思想: 首先对于 i 和 j 来比较, 一种情况是i和j匹配,此时 dp[i][j] = dp[i - 1][j - 1] + g[ str1[i] ][ str2[j] ],另一种情况是i和j不匹配,那么就有两种情况,一 i 和 j前面的匹配,j与一个空 即 ‘ - ’匹配,dp[i][j] = dp[i ][ j - 1] + g[ ' - ' ][ str2[j] ] ,二 i 前面的 和 j匹配上,此时 i 和 ‘ - ’匹配,dp[i][j] = dp[i - 1][ j] + g[ str1[i] ][ '-' ],三种情况取最大。

    这题就败在了初始化上=_=

    第一次只初始化了dp[0][0],后来将 dp[1][0]和dp[0][1]又初始化了,其实要把 dp【0】【i] 和 dp[i][0] 和 dp【0][0] 都要初始化,这也是很明显的=_=

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 #include <map>
     5 #include <algorithm>
     6 using namespace std;
     7 const int INF = 0x3f3f3f3f;
     8 const int Max = 210;
     9 int g[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, INF} };
    10 map<char, int> m; // 为每一个 字母建立一个映射
    11 int dp[Max][Max];
    12 int main()
    13 {
    14     m['A'] = 0;
    15     m['C'] = 1;
    16     m['G'] = 2;
    17     m['T'] = 3;
    18     m['-'] = 4;
    19     int T;
    20     scanf("%d", &T);
    21     while (T--)
    22     {
    23         int len1, len2;
    24         char str1[Max], str2[Max];
    25         scanf("%d %s", &len1, str1 + 1);
    26         scanf("%d %s", &len2, str2 + 1);
    27         dp[0][0] = 0 ;
    28         for (int i = 1; i <= len2; i++)
    29             dp[0][i] = dp[0][i - 1] + g[4][ m[str2[i]] ];
    30         for (int i = 1; i <= len1; i++)
    31             dp[i][0] = dp[i - 1][0] + g[ m[str1[i]] ][4];
    32         
    33         //cout << str1 + 1 << endl;
    34         //cout << str2 + 1 << endl;
    35         for (int i = 1; i <= len1; i++)
    36         {
    37             for (int j = 1; j <= len2; j++)
    38             {
    39                 dp[i][j] = dp[i - 1][j - 1] + g[ m[str1[i]] ][ m[str2[j]] ];
    40                 //if (dp[i - 1][j] + g[ m[str1[i]] ][4]  INF)
    41                 dp[i][j] = max(dp[i][j], dp[i - 1][j] + g[ m[str1[i]] ][4]); //其实初始化在这里很明显,因为要用dp[i - 1][j】,当 i= 1时,必须知道所有的 dp[0][j]+_+
    42                 //if (dp[i][j - 1] + g[4][ m[str2[j]] ] != INF)
    43                 dp[i][j] = max(dp[i][j], dp[i][j - 1] + g[4][ m[str2[j]] ]);
    44             }
    45         }
    46         printf("%d
    ", dp[len1][len2]);
    47     }
    48     return 0;
    49 }
    View Code
  • 相关阅读:
    hdoj 2803 The MAX【简单规律题】
    hdoj 2579 Dating with girls(2)【三重数组标记去重】
    hdoj 1495 非常可乐【bfs隐式图】
    poj 1149 PIGS【最大流经典建图】
    poj 3281 Dining【拆点网络流】
    hdoj 3572 Task Schedule【建立超级源点超级汇点】
    hdoj 1532 Drainage Ditches【最大流模板题】
    poj 1459 Power Network【建立超级源点,超级汇点】
    hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
    hdoj 1012 u Calculate e
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/5361680.html
Copyright © 2011-2022 走看看