📅  最后修改于: 2023-12-03 14:55:33.293000             🧑  作者: Mango
给定一个大小为n * m的矩形网格,我们要求在其中放置大小为2 * 1的矩形(包括正放和横放)的方案数。
我们可以设dp[i]表示在一个大小为i * 2的矩形中放置2 * 1的矩形的方案数。
那么显然当i=1时,只有一种放置方案;当i=2时,可以放置两个横放的2 * 1矩形或者两个正放的2 * 1矩形,有两种放置方案;当i>2时,对于第一个放置的矩形,我们有两种选择:放一个横放的2 * 1矩形或者放两个正放的2 * 1矩形;对于第二个放置的矩形,如果第一个放置的是横放的,则只能放一个正放的2 * 1矩形;如果第一个放置的是正放的,则可以选择放一个横放的2 * 1矩形或者一个正放的2 * 1矩形。综上所述,可以得到递推式:dp[i] = dp[i-1] + dp[i-2]。
最后,我们需要求解的是在大小为n * m的矩形中放置2 * 1的矩形的方案数,即dp[m]。
def count_rectangles(n, m):
dp = [1, 2] + [0] * (m - 2)
for i in range(2, m):
dp[i] = dp[i-1] + dp[i-2]
return dp[m-1] * n
输入:
n = 3, m = 2
输出:
18
解释:
在一个3 * 2的矩形中放置2 * 1的矩形的方案数为dp[2] = 2,因此总方案数为dp[2] * n = 6 * 3 = 18。