标签:ons col strong show 过程 put 动态规划 tps highlight
相对于上一篇 初级 ,这道题稍加深难度,下面这题,比上面多了一个最长子序列的输出,测试一下理解程度,逆序过程
第1行:字符串A 第2行:字符串B (A,B的长度 <= 1000)
输出最长的子序列,如果有多个,随意输出1个。
abcicba abdkscab
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) 问题进一步理解
标签:ons col strong show 过程 put 动态规划 tps highlight
原文地址:https://www.cnblogs.com/z-712/p/11134614.html