背景
从前,有一个古老的帝国有两个形状不同的塔分别在不同的两个城市里。这两个塔是用圆形的砖一块一块建成的。这些圆形砖的高度是一样的,其半径都是整数。很明显,尽管这两个塔形状不同,但造塔所使用的圆形砖却有很多是相同的。
过了很多年,一个国王命令他的建筑师们移除两个塔的部分砖以便使它们的形状完全一样,同时使两个塔的高度尽可能的高,并且新塔的砖瓦的排列顺序必须与原来的一样。国王认为这样的两个塔象征着这两个城市之间的和谐和平等,于是命名它们为双胞胎塔。
任务
现在,两千年以后,你可以来处理这样非常简单的问题:给你两个不同形状塔的描述,你只要算出能建成的新双塔的最多的砖瓦数。
输入
输入包括以下内容:第一行输入两个整数N1 和 N2 (1 <= N1,N2 <= 100) 分别表示最初时两个塔的砖瓦数;第二行输入N1 个正整数表示第一个塔砖瓦的半径(按从上到下的顺序排列);下面的一行输入 N2 个整数表示第二个塔砖瓦的半径(按从上到下的顺序排列)。
当输入的 N1 和 N2 为 0 时结束。
输出
输出建成的新双塔的最多的砖瓦数。
Sample Input
7 6
20 15 10 15 25 20 15
15 25 10 20 15 20
8 9
10 20 20 10 20 10 20 10
20 10 20 10 10 20 10 10 20
0 0
Sample Output
Twin Towers #1
Number of Tiles : 4
Twin Towers #2
Number of Tiles : 6
LCS算法。
#include<stdio.h>
#include<string.h>
#define maxn 110
int ans[maxn][maxn];
int a1[maxn], a2[maxn];
int max(int a, int b, int c)
{
if (a >= b)
{
if (a >= c)
return a;
return c;
}
else {
if (b >= c)
return b;
else return c;
}
}
int main()
{
int N1,N2;
int i, j;
int T = 1;
while (scanf("%d%d", &N1, &N2) != EOF&&N1&&N2)
{
memset(a1, 0, sizeof(a1));
memset(a2, 0, sizeof(a2));
memset(ans, 0, sizeof(ans));
for (i = 1;i <= N1;i++)
{
scanf("%d", &a1[i]);
}
for (i = 1;i <= N2;i++)
{
scanf("%d", &a2[i]);
}
for (i = 1;i <= N1;i++)
{
for (j = 1;j <= N2;j++)
{
if (a1[i] != a2[j])
{
ans[i][j] = max(ans[i][j], ans[i - 1][j], ans[i][j - 1]);
}
else ans[i][j] = ans[i - 1][j - 1] + 1;
}
}
printf("Twin Towers #%d\n", T);
printf("Number of Tiles : %d\n", ans[N1][N2]);
T++;
}
}