动态规划(dp)----公共子序列(LCS) 问题进一步理解

Posted z-712

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划(dp)----公共子序列(LCS) 问题进一步理解相关的知识,希望对你有一定的参考价值。

相对于上一篇 初级 ,这道题稍加深难度,下面这题,比上面多了一个最长子序列的输出,测试一下理解程度,逆序过程

 

 51nod1006

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)
比如两个串为:
 
abcicba
abdkscab
 
ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input

第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)

Output
输出最长的子序列,如果有多个,随意输出1个。
 
Input示例
abcicba
abdkscab
 
Output示例
abca

 

#include <stdio.h>
#include <iostream>
#include <string.h>
const int maxn=1005;
int dp[maxn][maxn]=0;
using namespace std;
int main()
	char a[maxn],b[maxn],lcs[maxn];
	int i,j;
	scanf("%s %s",a,b);
	int lena=strlen(a),lenb=strlen(b);
	for(i=1;i<=lena;i++)   
		for(j=1;j<=lenb;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]); 
			//0 1取不取,两种情况取最大                                 
		
	
	i=lena,j=lenb;            
                              
	int len=dp[lena][lenb];  
    lcs[len]=‘\\0‘;       
    while(dp[i][j])   
		if(dp[i][j]==dp[i-1][j]) i--;     
		else if(dp[i][j]==dp[i][j-1]) j--;  
		else lcs[--len]=a[i-1],i--,j--;   //--len i-1  边边角角的小细节,,要注意下 
     
    printf("%s\\n",lcs);
	return 0;

 

以上是关于动态规划(dp)----公共子序列(LCS) 问题进一步理解的主要内容,如果未能解决你的问题,请参考以下文章

动态规划——最长公共子序列(LCS)

最长公共子序列(LCS)动态规划解题笔记

最长公共子序列(LCS)动态规划解题笔记

最长公共子序列及其引申问题

动态规划算法解最长公共子序列LCS问题

动态规划之最长公共子序列(LCS)