http://blog.youkuaiyun.com/tiantangrenjian/article/details/19921051
最长公共子序列!!!
题意:
题目抽象出来就是寻找两个序列的最长公共子序列, 但是公共部分允许元素重复出。
分析:
是最长公共子序列(LCS,Longest Common Subsequence)的变种-公共部分可以元素重复。
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
using namespace std;
//此代码使用前,需删除下面两行+后面的system("PAUSE")
ifstream fin("in.txt");
#define cin fin
int like[201]={0};
int given[10001]={0};
int len[201][10001]={0};
int LCS(int row,int col)
{
int i,j;
int max;
for(i=1;i<=row;i++){
for(j=1;j<=col;j++){
max = len[i-1][j-1];
if(max < len[i][j-1])max = len[i][j-1];
if(max < len[i-1][j])max = len[i-1][j]; //先求出左边、上边、左上边 三个值中的最大值
if(like[i]==given[j]){ //如果相等,则将最大值+1
len[i][j] = max+1;
}else{
len[i][j] = max;
}
}
}
return len[row][col];
}
int main()
{
int n,m,l;
cin>>n>>m;
int i;
for(i=0;i<m;i++)cin>>like[i+1];
cin>>l;
for(i=0;i<l;i++)cin>>given[i+1];
cout<<LCS(m,l)<<endl;
system( "PAUSE");
return 0;
}