Leetcode: 1240. Tiling a Rectangle with the Fewest Squares

Problem Statement

class Solution:
    def tilingRectangle(self, n: int, m: int) -> int:
        grid = [[0] * m for _ in range(n)]

        ans = n * m

        def bt(i, j, cur):
            nonlocal ans
            if cur >= ans:
                return
            if i == n:
                ans = min(ans, cur)
                return
            while j < m and grid[i][j] > 0:
                j += 1
            if j == m:
                bt(i + 1, 0, cur)
                return
            for k in range(min(n - i, m - j), 0, -1):
                valid = True
                for ii in range(i, i + k):
                    for jj in range(j, j + k):
                        if grid[ii][jj] > 0:
                            valid = False
                        grid[ii][jj] += 1
                if valid:
                    bt(i, j + k, cur + 1)
                for ii in range(i, i + k):
                    for jj in range(j, j + k):
                        grid[ii][jj] -= 1

        bt(0, 0, 0)
        return ans


assert Solution().tilingRectangle(2, 3) == 3
assert Solution().tilingRectangle(5, 8) == 5
assert Solution().tilingRectangle(11, 13) == 6