模板:
最小化:
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