IDEA
1.本题是求最长连续子串,但是相同子串允许重复出现
2.采用动态规划方法,将动态表表示最大出现长度
2 | 2 | 4 | 1 | 5 | 5 | 6 | 3 | 1 | 1 | 5 | 6 | ||
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | |
2 | 0 | 1 | 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 |
1 | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 3 | 3 | 4 | 4 | 4 | 4 |
5 | 0 | 1 | 2 | 2 | 3 | 4 | 5 | 5 | 5 | 5 | 5 | 6 | 6 |
6 | 0 | 1 | 2 | 2 | 3 | 4 | 5 | 6 | 6 | 6 | 6 | 6 | 7 |
CODE
#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
#include<fstream>
using namespace std;
int fav[201]={0};
int given[10001]={0};
int dp_len[201][10001]={0};
int main(){
#ifndef ONLINE_JUDGE
freopen("input.txt","r",stdin);
#endif
int n,m,l;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>fav[i];
}
cin>>l;
for(int i=1;i<=l;i++){
cin>>given[i];
}
//动态规划算法
for(int i=1;i<=m;i++){
for(int j=1;j<=l;j++){
int mmax=max(dp_len[i][j-1],dp_len[i-1][j]);
if(fav[i]==given[j]){
dp_len[i][j]=mmax+1;
}else{
dp_len[i][j]=mmax;
}
}
}
cout<<dp_len[m][l];
#ifndef ONLINE_JUDGE
fclose(stdin);
#endif
return 0;
}