首页 > 其他 > 详细

最长公共子序列问题 (LCS)

时间:2016-03-01 20:41:21      阅读:215      评论:0      收藏:0      [点我收藏+]

 给定两个字符串S和T.求出这两个字符串最长的公共子序列的长度.

输入:

n=4

m=4

s="abcd"

t="becd"

 

输出:

3("bcd")

 

这类问题被称为最长公共子序列问题(LCS,Longest Common Subsequence)的著名问题.

                     max(dp[i][j]+1,dp[i][j+1],dp[i+1][j])   (s=t)

dp[i+1][j+1]=

                      max(dp[i][j+1],dp[i+1][j])                  (其他)

 

 

这个递推式可用O(nm)计算出来,dp[n][m]就是LCS的长度.

 

 

j\i

0

1{b}

2{e}

3{c}

4{d}

0

0

0

0

0

0

1{a}

0

0

0

0

0

2{b}

0

1

1

1

1

3{c}

0

1

1

2

2

4{d}

0

1

1

2

3

 

 

 1 int n,m;
 2 char s[MAX],t[MAX];
 3 int dp[MAX][MAX];   //DP数组
 4 
 5 void solve()
 6 {
 7     for(int i=0; i<=n; i++){
 8         for(int j=0; j<=m; j++){
 9             if(s[i]==t[j]){
10                 dp[i+1][j+1]=dp[i][j]+1;
11             }
12             else{
13                 dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
14             }
15         }
16     }
17     printf("%d\n",dp[n][w]);
18 }

 

 

 

 

 

 

 

来自:<<挑战程序设计竞赛>>

最长公共子序列问题 (LCS)

原文:http://www.cnblogs.com/wangmengmeng/p/5232221.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!