📅  最后修改于: 2023-12-03 15:10:36.538000             🧑  作者: Mango
给定一个长度为 n
的正整数数组 nums
,最小化成本,使得所有相邻的元素都不相同。
我们定义 dp[i][j]
表示以 nums[i]
结尾,最后一个元素为 j
的最小成本。
在考虑状态转移方程之前,我们需要先分析两种情况:
nums[i]
等于 j
,这时状态转移方程为:
dp[i][j] = min(dp[i][j], dp[i - 1][k] + cost(j, k))
其中,k
表示上一个元素,cost(j, k)
表示从 k
到 j
的转换成本。
nums[i]
不等于 j
,这时状态转移方程为:
dp[i][nums[i]] = min(dp[i][nums[i]], dp[i - 1][j] + cost(nums[i], j))
我们将两种情况的状态转移方程合并起来,得到最终的状态转移方程:
dp[i][j] = min(dp[i][j], dp[i - 1][k] + cost(j, k))
dp[i][nums[i]] = min(dp[i][nums[i]], dp[i - 1][j] + cost(nums[i], j))
当 i = 0
时,需要先初始化 dp
数组:
dp[0][j] = cost(nums[0], j)
最终的结果就是 dp[n - 1][j]
中的最小值。
def min_cost(nums):
n = len(nums)
INF = float("inf")
dp = [[INF] * 101 for _ in range(n)]
for j in range(101):
dp[0][j] = cost(nums[0], j)
for i in range(1, n):
for j in range(101):
for k in range(101):
if j != k:
dp[i][j] = min(dp[i][j], dp[i - 1][k] + cost(j, k))
dp[i][nums[i]] = min(dp[i][nums[i]], dp[i - 1][j] + cost(nums[i], j))
return min(dp[n - 1])
其中 cost(j, k)
表示从 j
转换到 k
的成本,这里可以根据实际情况进行定义。