最长公共子序列

初三的课程终于完了,可以一心一意搞竞赛了,这一个月我要学会基础动规……

最长公共子序列可以说是非常经典的动规基础题,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]);            
        
    }
}

posted @ 2017-05-31 18:17  xinyimama  阅读(72)  评论(0)    收藏  举报