HDU 1159——Common Subsequence(DP)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159

 

题解

#include<iostream>
#include<cstring>
using namespace std;

char A[1005],B[1005]; //存放字符串 
int dp[1005][1005]; //存放到字符串a第 i+1个字符,字符串b第 j+1个字符为止的最大长度公共子序列的长度

int main(){
    while(~scanf("%s%s",A,B)){
        int alen=strlen(A),blen=strlen(B); //注意头文件
        for(int i=0;i<alen;i++){
            for(int j=0;j<blen;j++){
                if(A[i]==B[j])
                    dp[i+1][j+1]=dp[i][j]+1;
                else
                    dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
            }
        }
        printf("%d\n",dp[alen][blen]);
    }
    return 0;
}

定义 dp[ i ][ j ]为 A1...Ai 和 B1...Bj 对应的 LCS(最长公共子序列)长度

那么,A1...Ai+1 和 B1...Bj+1 对应的公共子列可能是

  • 当 Ai+1==Bj+1时,在 A1...Ai 和 B1...Bj 的公共子列末尾追加上 Ai+1
  • A1...Ai+1 和 B1...Bj 的公共子列
  • A1...Ai 和 B1...Bj+1 的公共子列

三者中的一个,则有以下递推关系成立

dp[ i+1 ][ j+1 ]=\left\{\begin{matrix}max(dp[i][j]+1,dp[i][j+1],dp[i+1][j]) (Ai+1=Bi+1) \\max(dp[i][j+1],dp[i+1][j]) (others) \end{matrix}\right.

该递推式时间复杂度O(nm),dp[n][m]就是LCS的长度

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值