提意:
各处两个字符序列{an}和{bn},求它们的最长公共子序列的长度
设f[i][j]表示{an}的前i个字符构成的序列与{bm}的前j个字符构成的序列的最长公共子序列的
长度,{an}与{bm}的最长公共子序列的长度即为 f[n][m]。
考虑{an}的前 i 个字符序列与{bm}的前 j 个字符序列的所有可能的公共子序列情况:
1、a[i]=b[j]时
此时必存在一个以 a[i]为最后一个元素的最长公共子序列(想一想为什么) 。除去 a[i]和 b[j]
后,最长公共子序列的长度是 f[i‐1][j‐1],因此此时最长公共子序列长度为 f[i‐1][j‐1]+1。
2、a[i]<>b[j]时
第 1 类:a[i]是公共子序列的最后一个元素。此时 b[j]必然不是公共子序列中的元素,因此有
没有 b[j]公共子序列的长度都不变,所以 f[i][j]=f[i][j‐1]。
第 2 类:a[i]不是公共子序列的最后一个元素。有没有 a[i]不影响公共子序列的长度,所以此
时 f[i][j]=f[i‐1][j]。
综上:
代码:
#include <iostream> using namespace std; int f(int i, int j, char src[], char dst[]) { if(i==0||j==0) return 0; if(i>0&&j>0&&(src[i]==dst[j])) return f(i-1, j-1,src,dst)+1; if(i>0&&j>0&&(src[i]!=dst[j])) return max(f(i-1,j,src,dst),f(i,j-1,src,dst)); } int main() { char src[20] = {'\0'}; char dst[20] = {'\0'}; cin>>src>>dst; cout<<"The Max of length of arrary: "<<f(strlen(src), strlen(dst), src, dst)<<endl; }