Skip to content

DP

Two List

Template

dp = [[0 for _ in range(n+1)] for _ in range(m+1)]
for i in range(m):
    for j in range(n):
        dp[i+1][j+1] = max(dp[i][j+1], dp[i+1][j])
        if text1[i] == text2[j]:
            dp[i+1][j+1] = max(dp[i+1][j+1], dp[i][j] + 1)

What I have done

583. Delete Operation for Two Stringsconvert one string to another string, delete, insert, convert
1143. Longest Common Subsequence

Range DP --> Palindromic Substring / Sequence

Template

palindromic substring

for i in range(n):
    dp[i][i] = 1
    if i > 0:
        dp[i][i-1] = 1
for length in range(2, n + 1):
    for i in range(0, n-length+1):
        j = i + length - 1
        if s[i] == s[j] and dp[i+1][j-1]:
            dp[i][j] = 2 + dp[i+1][j-1]

palindromic sequence

for length in range(2, n + 1):
    for i in range(0, n-length+1):
        j = i + length - 1
        if s[i] == s[j] and dp[i+1][j-1]:
            dp[i][j] = 2 + dp[i+1][j-1]
        else:
            dp[i][j] = max(dp[i+1][j], dp[i][j-1]) # 最长连续子串就没有这里

What I have done

5. Longest Palindromic Substring
🌟115. Distinct Subsequences
131. Palindrome Partitioning
516. Longest Palindromic Subsequence
647. Palindromic Substrings
718. Maximum Length of Repeated Subarray
1035. Uncrossed Lines
1312. Minimum Insertion Steps to Make a String

Tree DP

Template

def dfs(node):
    nonlocal ans
    if not node:
        return 2
    left_state = dfs(node.left)
    right_state = dfs(node.right)
    if left_state == 0 or right_state == 0:
        ans += 1
        return 1
    if left_state == 1 or right_state == 1:
        return 2
    return 0

What I have done

337. House Robber III
968. Binary Tree Cameras

Alice and Bob

Template

1-D

for i in range(n-1, -1, -1):
    for m in range(1, n+1):
        if i + 2 * m >= n:
            dp[i][m] = suffix[i]
        else:
            for x in range(1, 2 * m + 1):
                bob_score = dp[i+x][max(x, m)]
                alice_score = suffix[i] - bob_score
                dp[i][m] = max(dp[i][m], alice_score)

What I have done

486. Predict the Winnerboth players are playing optimally??
1140. Stone Game II

Knapsack Problem

0-1 Knapsack Problem

Template

recursive formula

dp[j] 表示: 容量为j的背包,所背的物品价值最大可以为dp[j] dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

for i in range(len(nums)):
    for j in range(target, nums[i] - 1, -1):  # Iterate from target down to nums[i]
        dp[j] = max(dp[j], dp[j - nums[i]] + nums[i])

What I have done

416. Partition Equal Subset Sum
494. Target Sum方案数就是+=
1049. Last Stone Weight II转化为将一堆stone放进最大容量为sum/2的背包,求放进去的石头的最大重量MaxWeight,最终答案即为sum-2*MaxWeight
474. Ones and Zeroesweight可以是二维

Unbounded Knapsack Problem

Template

for i in range(len(weight)):
    for j in range(weight[i], bagWeight + 1): 
        dp[j] = max(dp[j], dp[j - weight[i]] + value[i])

组合数

for i in range(len(coins)):
    for j in range(coins[i], amount+1):
        dp[j] += dp[j-coins[i]]

排列数

for j in range(1, target+1):
    for i in range(len(nums)):
        if j < nums[i]:
            continue
        dp[j] += dp[j-nums[i]]

What I have done

279. Perfect Squares
377. Combination Sum IV排列
518. Coin Change II组合

Other

What I have done

96. Unique Binary Search Trees
343. Integer Break

House Robber

dp[0] = nums[0]
dp[1] = max(nums[0], nums[1])
for i in range(2, len(nums)):
    dp[i] = max(dp[i-1], dp[i-2] + nums[i])

198. House Robber 213. House Robber II

Best Time to Buy and Sell Stock

Template

What I have done

121. Best Time to Buy and Sell Stock
122. Best Time to Buy and Sell Stock II
123. Best Time to Buy and Sell Stock III
188. Best Time to Buy and Sell Stock IV
309. Best Time to Buy and Sell Stock with Cooldown
714. Best Time to Buy and Sell Stock with Transaction

Math

Template

nums = [1]
i_2 = 0
i_3 = 0
i_5 = 0
while len(nums) < n:
    nxt_2 = nums[i_2] * 2
    nxt_3 = nums[i_3] * 3
    nxt_5 = nums[i_5] * 5
    nxt = min(nxt_2, nxt_3, nxt_5)
    nums.append(nxt)
    if nxt == nxt_2:
        i_2 += 1
    if nxt == nxt_3:
        i_3 += 1
    if nxt == nxt_5:
        i_5 += 1
return nums[n-1]

What I have done

264. Ugly Number II
313. Super Ugly Number
🌟1201. Ugly Number III容斥+二分

What I have done

467. Unique Substrings in Wraparound String