题意:给两个数n和m,代表两个序列的个数,输出这两个序列的最大公共子序列的个数。
解析:这是一道普通的最大公共子序列的题目。
注意:每个样例结束之后,要输出一个空行。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int num[N],goal[N],dp[N][N];
int main() {
int n,m,cas = 1 , t = 0;
while(scanf("%d%d",&n,&m) != EOF && (n && m)) {
for(int i = 1; i <= n; i++) {
scanf("%d",&num[i]);
}
for(int i = 1; i <= m; i++) {
scanf("%d",&goal[i]);
}
memset(dp,0,sizeof(dp));
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(num[i] == goal[j]) {
dp[i][j] = dp[i-1][j-1] + 1;
}else {
dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
}
}
}
printf("Twin Towers #%d\n",cas++);
printf("Number of Tiles : %d\n\n",dp[n][m]);
}
return 0;
}