模板:
最小化:
class Solution: def minCost(self, n: int, cuts: List[int]) -> int: cuts.sort() cuts=[0]+cuts+[n] m=len(cuts) dp=[[float("inf")]*(m) for _ in range(m)] dp[0][0] = 0 for i in range(1,m): dp[i][i] = 0; dp[i-1][i] = 0; for l in range(m-2,-1,-1): for r in range(l+1,m): for k in range(l+1,r): dp[l][r]=min(dp[l][r],dp[l][k]+dp[k][r]+cuts[r]-cuts[l]) return dp[0][m-1]
最大化:
class Solution: def maxCoins(self, nums: List[int]) -> int: nums=[1]+nums+[1] n=len(nums) dp=[[0]*(n) for _ in range(n)] for i in range(n-2,-1,-1): for j in range(i+1,n): for k in range(i+1,j): dp[i][j]=max(dp[i][j],nums[i]*nums[k]*nums[j]+dp[i][k]+dp[k][j]) return dp[0][n-1]
K组合并:
class Solution: def mergeStones(self, stones: List[int], K: int) -> int: n=len(stones) if (n-1)%(K-1):return -1 prefix = [0] * (n+1) for i in range(1,n+1): prefix[i] = stones[i-1] + prefix[i-1] @functools.lru_cache(None) def dp(i, j, m): if (j - i + 1 - m) % (K - 1): return float("inf") if i == j: return 0 if m == 1 else float("inf") if m == 1: return dp(i, j, K) + prefix[j + 1] - prefix[i] temp=float("inf") for mid in range(i, j, K - 1): temp=min(temp, dp(i, mid, 1) + dp(mid + 1, j, m - 1) ) return temp res = dp(0, n - 1, 1) return res