lintcode -- 房屋染色

本文探讨了在直线上排列的房屋染色问题,目标是选择颜色以使相邻房屋颜色不同,并最小化总成本。染色费用由一个矩阵给出,其中不同颜色对应不同的费用。解决方案需要考虑如何有效地在红色、蓝色和绿色之间切换,以达到最低费用。

这里有n个房子在一列直线上,现在我们需要给房屋染色,分别有红色蓝色和绿色。每个房屋染不同的颜色费用也不同,你需要设计一种染色方案使得相邻的房屋颜色不同,并且费用最小。

费用通过一个nx3 的矩阵给出,比如cost[0][0]表示房屋0染红色的费用,cost[1][2]表示房屋1染绿色的费用。

 注意事项

所有费用都是正整数

样例

costs = [[14,2,11],[11,14,5],[14,3,10]] return 10

房屋 0 蓝色, 房屋 1 绿色, 房屋 2 蓝色, 2 + 5 + 3 = 10




/*
动态规划题,我们看第i个房子涂什么颜色,由于总共只有三种颜色,所以当第i个房子涂红色时,
第i-1个房子只能涂蓝色和绿色,依次递推。只要将这三种情况得出的答案中的最小值就是最优解。可以直接利用原数组进行递推计算,无需使用额外空间。
*///博客
public class Solution {


    public int minCost(int[][] costs){
        if(costs == null || costs.length ==0)return 0;
        int len = costs.length-1;
        for(int i=1;i<=len;i++){
            costs[i][0] +=Math.min(costs[i-1][1],costs[i-1][2]);
            costs[i][1] +=Math.min(costs[i-1][0],costs[i-1][2]);
            costs[i][2] +=Math.min(costs[i-1][0],costs[i-1][1]);
            
        }
        return Math.min(Math.min(costs[len][0],costs[len][1]),costs[len][2]);
    }
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值