HDU1080 【LCS变形】

本文介绍了一种最长公共子序列(LCS)问题的变种,即考虑空格匹配的情况来最大化字符串匹配的价值。通过动态规划的方法,文章详细阐述了如何实现这一算法,并给出了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:

给你每种字符匹配的权值大小,给你两个串,长度小的串可以在小串里面添加空格和大串匹配,问你一个最大匹配权值。

思路:

有点类似于LCS吧,我们在求两个串的LCS的时候,不行的就扔掉了,在这里就是不行的就给他匹配了一个空格;

dp[i][j-1]           j匹配空格;
dp[i-1][j]           i匹配空格;
dp[i-1][j-1]       i和j匹配;

初始化
dp[i][0]    i匹配空格
dp[0][j]    j匹配空格


#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int>PII;
const double eps=1e-5;
const double pi=acos(-1.0);
const int INF=0x3f3f3f3f;
int temp[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
};

int change(char x)
{
    if(x=='A')
        return 0;
    if(x=='C')
        return 1;
    if(x=='G')
        return 2;
    if(x=='T')
        return 3;
    return 4;
}

int s1[110];
int s2[110];
int dp[110][110];
char s[110];

int main()
{
    int len1,len2;
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%s",&len1,s+1);
//        memset(dp,0,sizeof(dp));
        dp[0][0]=0;

        memset(s1,0,sizeof(s1));
        memset(s2,0,sizeof(s2));
        for(int i=1;i<=len1;i++)
        {
            s1[i]=change(s[i]);
            dp[i][0]=dp[i-1][0]+temp[s1[i]][4];
        }
        scanf("%d%s",&len2,s+1);
        for(int i=1;i<=len2;i++)
        {
            s2[i]=change(s[i]);
            dp[0][i]=dp[0][i-1]+temp[4][s2[i]];
        }

        for(int i=1;i<=len1;i++)
        {
            for(int j=1;j<=len2;j++)
            {
                dp[i][j]=-INF;
                dp[i][j]=max(dp[i][j],max(dp[i-1][j-1]+temp[s1[i]][s2[j]],max(dp[i-1][j]+temp[s1[i]][4],dp[i][j-1]+temp[4][s2[j]])));
            }
        }

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值