Сложность: hard
Если задан прямоугольник размером n x m, верните минимальное количество квадратов с целочисленными сторонами, которые покрывают этот прямоугольник.
Пример:
Input: n = 2, m = 3
Output: 3
👨💻 Алгоритм:
1⃣Инициализация рекурсивной функции:
Функция принимает размеры прямоугольника n x m.
2⃣Базовый случай:
Если n = 0 или m = 0, возвращаем 0, так как не осталось пространства для покрытия.
3⃣Рекурсивный случай:
Находим наибольший возможный квадрат, который может быть размещен в текущем прямоугольнике. Это квадрат со стороной min(n, m).
Размещаем этот квадрат в левом верхнем углу и рекурсивно покрываем оставшиеся три части:
Прямоугольник слева от квадрата.
Прямоугольник сверху от квадрата.
Прямоугольник справа и снизу от квадрата.
😎 Решение:
class Solution {
func tilingRectangle(_ n: Int, _ m: Int) -> Int {
var dp = Array(repeating: Array(repeating: Int.max, count: m + 1), count: n + 1)
for i in 1...min(n, m) {
dp[i][i] = 1
}
for h in 1...n {
for w in 1...m {
if h == w { continue }
for i in 1...h / 2 {
dp[h][w] = min(dp[h][w], dp[i][w] + dp[h - i][w])
}
for j in 1...w / 2 {
dp[h][w] = min(dp[h][w], dp[h][j] + dp[h][w - j])
}
}
}
return dp[n][m]
}
}Ставь 👍 и забирай 📚 Базу знаний