简单DP问题
采用动态规划的算法,记录下每一个从头到每个位置的子字符串的最长序列, 例如:
2 2 4 1 5 5 6 3 1 1 5 6
2 0 1 2 2 2 2 2 2 2 2 2 2 2
2 3 0 1 2 2 2 2 2 2 3 3 3 3 3
2 3 1 0 1 2 2 3 3 3 3 3 4 5 5 5
2 3 1 5 0 1 2 2 3 4 5 5 5 5 5 6 6
2 3 1 5 6 0 1 2 2 3 4 5 6 6 6 6 6 7
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <vector>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <set>
using namespace std;
int n,m,l;
int main(){
//freopen("E://PAT/input.txt", "r", stdin);
scanf("%d %d",&n,&m);
vector<int>M(m);
for(int i=0;i<m;i++) scanf("%d",&M[i]);
scanf("%d",&l);
vector<int>L(l);
for(int i=0;i<l;i++) scanf("%d",&L[i]);
vector<vector<int> > dp(m+1,vector<int>(l+1,0));
for(int i=1;i<=m;i++){
for(int j=1;j<=l;j++){
if(M[i-1]==L[j-1])
dp[i][j]=max(dp[i-1][j],dp[i][j-1])+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
printf("%d",dp[m][l]);
return 0;
}