(这道题告诉我:初始化要小心)
有没有一点最长公共子序列的赶脚(口胡)
但我觉得挺像
设 表示匹配到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