考察的是最长公共子序列的变行,最长公共子序列(LCS)的经典解法是DP,
还有很多优化的方案,因为对这个题目这些已经可以了,所以我也就没看(主要是看不懂。。。),
唯一的变形是可以重复,所以要改一些地方
先看原始的LCS算法实例
int len = 7;
int X[] = {'Z', 'A', 'B', 'C', 'B', 'D', 'A'};
int Y[] = {'Y', 'B', 'D', 'C', 'A', 'B', 'A'};
for(int i=1; i<len; i++) {
for(int j=1; j<len; j++) {
if(X[i] == Y[j]) {
c[i][j] = c[i-1][j-1] + 1;
} else {
c[i][j] = max(c[i][j-1], c[i-1][j]);
}
}
}
这个题目变形后是:
using namespace std;
#define MAXN 202
#define MAXL 10002
int mymax[MAXN][MAXL];
int c[MAXN], g[MAXL];
int main()
{
int clen, glen;
int n;
scanf("%d", &n);
scanf("%d", &clen);
for(int i=1; i<=clen; i++)
scanf("%d", &c[i]);
scanf("%d", &glen);
for(int i=1; i<=glen; i++)
scanf("%d", &g[i]);
for(int i=1; i<=clen; i++) {
for(int j=1; j<=glen; j++) {
if(c[i] == g[j]) {
mymax[i][j] = max(mymax[i][j-1], mymax[i-1][j]) + 1;
} else {
mymax[i][j] = max(mymax[i][j-1], mymax[i-1][j]);
}
}
}
cout << mymax[clen][glen] << endl;
return 0;
}
还有要注意的是这种解法第一个输入数是没有用的