HDU 1159 -Common Subsequence

来源:互联网 发布:巨型加农炮升级数据 编辑:程序博客网 时间:2024/06/05 19:06

这里写图片描述
题目链接

题目分析

题意

每行输入两个字符串,求这两个字符串的最长公共子序列。

思路

子序列:
举例:abdfieeow 中(按顺序)adf、abow等都是其子序列。
最长子序列是动态规划(DP)的典型例子。
LCS(x,y)即字符串x和y的最长公共子序列。
当i=0或是j=0时
dp[i][j]=0
当a[i-1]==b[j-1]时
dp[i][j]=dp[i-1][j-1]+1
当a[i-1]!=b[j-1]时
dp[i][j]=max(dp[i-1][j],dp[i][j-1])

代码

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define M 5000int dp[M][M];//a中前M个字符串与b中前M个字符串的最长公共子序列的长度 char a[M],b[M];int main(){    //freopen("data.txt","r",stdin);    int i,j,la,lb;    while(~scanf("%s%s",a,b)){        la=strlen(a);        lb=strlen(b);        for(i=0;i<la;i++)            dp[i][0]=0;        for(j=0;j<lb;j++)            dp[0][j]=0;        for(i=1;i<=la;i++){            for(j=1;j<=lb;j++){                if(a[i-1]==b[j-1])                    dp[i][j]=dp[i-1][j-1]+1;                else                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);                }        }        printf("%d\n",dp[la][lb]);    }    return 0;}
0 0
原创粉丝点击