35 雙塔問題

2021-08-02 17:56:13 字數 1297 閱讀 7652

從前,有乙個古老的帝國有兩個形狀不同的塔分別在不同的兩個城市裡。這兩個塔是用圓形的磚一塊一塊建成的。這些圓形磚的高度是一樣的,其半徑都是整數。很明顯,儘管這兩個塔形狀不同,但造塔所使用的圓形磚卻有很多是相同的。

過了很多年,乙個國王命令他的建築師們移除兩個塔的部分磚以便使它們的形狀完全一樣,同時使兩個塔的高度盡可能的高,並且新塔的磚瓦的排列順序必須與原來的一樣。國王認為這樣的兩個塔象徵著這兩個城市之間的和諧和平等,於是命名它們為雙胞胎塔。

現在,兩千年以後,你可以來處理這樣非常簡單的問題:給你兩個不同形狀塔的描述,你只要算出能建成的新雙塔的最多的磚瓦數。

輸入

輸入包括以下內容:第一行輸入兩個整數 n1 和 n2 (1 <= n1,n2 <= 100) 分別表示最初時兩個塔的磚瓦數;第二行輸入 n1 個正整數表示第乙個塔磚瓦的半徑(按從上到下的順序排列);下面的一行輸入 n2 個整數表示第二個塔磚瓦的半徑(按從上到下的順序排列)。

當輸入的 n1 和 n2 為 0 時結束。

輸出

輸出建成的新雙塔的最多的磚瓦數。

測試輸入

期待的輸出

時間限制

記憶體限制

額外程序

測試用例 1

以文字方式顯示

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↵

以文字方式顯示

twin towers #1↵

number of tiles : 4↵

twin towers #2↵

number of tiles : 6↵

1秒1024kb0

//找兩個塔半徑大小的最大公共子串行

#include#includeint dp[105][105] = , tower1[105] = , tower2[105] = ;

int fmax(int a, int b)

int main()

else

dp[i][j] = dp[i - 1][j - 1] + 1;

}} printf("twin towers #%d\n", count++);

printf("number of tiles : %d\n", dp[num1][num2]);

} return 0;

}

vijos1037 雙塔問題

題意 n個任意高度的水晶,建造兩座塔,選取任意快,使得塔盡量高,且塔相等 思路 分情況說 第i快石頭 1 不用 dp i 1 j 2 放在高塔上 dp i 1 j a i a i 3 放在低塔上並且放後不超過高塔 dp i 1 j a i 4 放在低塔上超過了高塔 dp i 1 a i j j in...

雙色Hanoi塔問題

設a,b,c是3個塔座。開始時,在塔座a上有一疊共n個圓盤,這些圓盤自下而上,由大到小地疊在一起。各圓盤從小到大編號為1,2,n,奇數號圓盤著藍色,偶數號圓盤著紅色。現要求將塔座a上的這一疊圓盤移到塔座b上,並仍按同樣順序疊置。在移動圓盤時應遵守以下移動規則 規則 1 每次只能移動1個圓盤 規則 2...

雙色Hanoi塔問題

雙色hanoi塔問題 問題描述 設a b c是3 個塔座。開始時,在塔座a 上有一疊共n 個圓盤,這些圓盤自下而上,由大到小地疊在一起。各圓盤從小到大編號為1,2,n,奇數號圓盤著藍色,偶數號圓盤著紅色,如圖所示。現要求將塔座a 上的這一疊圓盤移到塔座b 上,並仍按同樣順序疊置。在移動圓盤時應遵守以...