• 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
  • 相关阅读:
    SpringSecurity 框架学习 3
    SpringSecurity 框架学习 项目创建
    nginx 限制ip访问
    nginx 负载均衡,后端服务获取不到域名问题
    Linux 安装 Nginx
    Linux 常用命令
    springcloud 服务追踪
    Hystrix 服务容错
    Scrum立会报告+燃尽图(十二月十日总第四十一次):用户推广
    Final发布:文案+美工展示博客
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/5361680.html
Copyright © 2020-2023  润新知