题意:给两个数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;
}
本文详细阐述了如何解决最大公共子序列问题,并通过实例展示了其在实际场景中的应用,包括输入输出规范和代码实现。
918

被折叠的 条评论
为什么被折叠?



