粉刷墙纸的问题
"""
输入: [[17,2,17],[16,16,5],[14,3,19]]
输出: 10
解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。
最少花费: 2 + 5 + 3 = 10。
解题思路:
本题采用动态规划的方式,类似求两个字符串求最大公共子序列。其中,
定义dp数组,表示前n个房间涂i的最小费用:
price = [[0 for _ in range(colours)] for _ in range(houses + 1)] #包含base case
#状态转移工程
price[house][colour] = min(
matrix[house-1][colour] + price[house-1][other_0],
matrix[house - 1][colour] + price[house - 1][other_1]
)
"""
def painting_house(matrix):
houses = len(matrix)
colours = len(matrix[0])
# dp定义,前n个房间涂i的最小费用
price = [[0 for _ in range(colours)] for _ in range(houses + 1)]
other_0 = 0
other_1 = 0
for house in range(1, houses + 1):
for colour in range(colours):
if colour == 0:
other_0 = 1
other_1 = 2
elif colour == 1:
other_0 = 0
other_1 = 2
elif colour == 2:
other_0 = 0
other_1 = 1
#状态转移工程
price[house][colour] = min(
matrix[house-1][colour] + price[house-1][other_0],
matrix[house - 1][colour] + price[house - 1][other_1]
)
res = float('inf')
for colour in range(colours):
res = min(res, price[houses][colour])
return res
if __name__ == "__main__":
matrix = [[17, 2, 17], [16, 16, 5], [14, 3, 19]]
res = painting_house(matrix)
print(res)
posted on 2021-12-16 09:48 random_boy 阅读(36) 评论(0) 收藏 举报
浙公网安备 33010602011771号