题目大意:给定组成两个塔的n个砖头高度以及m个砖头高度,求高度一样并且最长的子序列。
解题思路:写到不爱写了,又是经典的最长公共子序列模型。状态转移方程见前面的统一模型文章。
测试数据:
7 615 25 10 20 15 20
#include <stdio.h> #include <string.h> #define MAX 110 #define max(a,b) (a)>(b)?(a):(b) int n,m,dp[MAX][MAX]; int arr[MAX],brr[MAX]; int main() { int i,j,k,maxx,cas = 0; while (scanf("%d%d",&n,&m),n+m){ for (i = 1; i <= n; ++i) scanf("%d",&arr[i]); for (j = 1; j <= m; ++j) scanf("%d",&brr[j]); maxx = -1; memset(dp,-1,sizeof(dp)); for (i = 0; i < n; ++i) dp[i][0] = 0; for (i = 0; i < m; ++i) dp[0][i] = 0; for (i = 1; i <= n; ++i) for (j = 1; j <= m; ++j) { if (arr[i] == brr[j]) dp[i][j] = max(dp[i][j],dp[i-1][j-1]+1); else dp[i][j] = max(dp[i-1][j],dp[i][j-1]); if (dp[i][j] > maxx) maxx = dp[i][j]; } printf("Twin Towers #%d\nNumber of Tiles : %d\n\n",++cas,maxx); } }
本文ZeroClock原创,但可以转载,因为我们是兄弟。