最长公共子序列
初三的课程终于完了,可以一心一意搞竞赛了,这一个月我要学会基础动规……
最长公共子序列可以说是非常经典的动规基础题,lens[i][j]表示a中前i个字符和b中前j个字符最长的公共子序列,这个很重要
状态转移方程为
if(a[i]==b[j])
lens[i][j]=lens[i-1][j-1]+1;
else lens[i][j]=max(lens[i][j-1],lens[i-1][j]);
以下为ac代码 poj1438
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char a[1010],b[1010];
int na,nb,lens[1010][1010];
int main()
{
while(scanf("%s%s",a+1,b+1)!=EOF)
{
na=strlen(a+1);
nb=strlen(b+1);
for(int i=1;i<=na;i++)
for(int j=1;j<=nb;j++)
{
//lens[i][j]表示a中前i个字符和b中前j个字符里面能匹配的最长公共子序列
if(a[i]==b[j])
lens[i][j]=lens[i-1][j-1]+1;
else lens[i][j]=max(lens[i][j-1],lens[i-1][j]);
}
printf("%d\n",lens[na][nb]);
}
}

浙公网安备 33010602011771号