题解 [HNOI2002]DNA分子的最佳比对 (洛谷P2268)

题目传送门


(这道题告诉我:初始化要小心)

有没有一点最长公共子序列的赶脚(口胡)

但我觉得挺像

 表示匹配到s1的第i位,s2的第j位,则有

的初始化要注意:根据的含义,表示s1[i]一直在匹配空格(同理),所以要将初始化为

 上代码。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<iomanip>
#define R register int
using namespace std;
char a[110],b[110];
int f[110][110];

inline int max(int a,int b) {return a>b?a:b;}

int main()
{
    scanf("%s%s",a+1,b+1);
    R la=strlen(a+1),lb=strlen(b+1);
    for(R i=1,x=-2;i<=la||i<=lb;i++,x-=2) f[0][i]=f[i][0]=x;
    f[0][0]=0;
    for(R i=1;i<=la;i++) for(R j=1;j<=lb;j++)
        f[i][j]=max(f[i-1][j]-2,max(f[i][j-1]-2,f[i-1][j-1]+(a[i]==b[j]?1:0)));
    printf("%d
",f[la][lb]);
    return 0;
}

如有错误,恳请您指正(我太菜了);如有不理解,可留言,我会尽量回复。。。(高中生(逃)。。)

by Jackpei 2019.2.24

原文地址:https://www.cnblogs.com/Jackpei/p/10426595.html