LeetCode題解(1621):大小為K的不重疊線段的數目(Python)

長行發表於2020-11-10

題目:原題連結(中等)

標籤:動態規劃

解法時間複雜度空間複雜度執行用時
Ans 1 (Python) O ( N × K ) O(N×K) O(N×K) O ( N × K ) O(N×K) O(N×K)544ms (59%)
Ans 2 (Python)
Ans 3 (Python)

解法一(動態規劃):

class Solution:
    def numberOfSets(self, n: int, k: int) -> int:
        # 處理不夠分的情況
        if n - 1 < k:
            # print("計算:", n, k, "->", 0)
            return 0

        # 處理剛好夠分的情況
        if n - 1 == k:
            # print("計算:", n, k, "->", 1)
            return 1

        # 處理只分成一個的情況
        if k == 1:
            # print("計算:", n, k, "->", n * (n - 1) // 2)
            return n * (n - 1) // 2

        # 處理一般的情況

        # 定義狀態表格
        # O(N×K)
        dp = [[0] * n for _ in range(k)]

        # 計算第一行
        for j in range(1, n):
            dp[0][j] = j * (j + 1) // 2

        # 計算其他行
        for i in range(1, k):
            total = dp[i - 1][i]
            for j in range(i + 1, n):
                dp[i][j] = dp[i][j - 1] + total
                total += dp[i - 1][j]

        return dp[-1][-1] % (10 ** 9 + 7)

相關文章