面试算法91:粉刷房子

题目

一排n幢房子要粉刷成红色、绿色和蓝色,不同房子被粉刷成不同颜色的成本不同。用一个n×3的数组表示n幢房子分别用3种颜色粉刷的成本。要求任意相邻的两幢房子的颜色都不一样,请计算粉刷这n幢房子的最少成本。例如,粉刷3幢房子的成本分别为[[17,2,16],[15,14,5],[13,3,1]],如果分别将这3幢房子粉刷成绿色、蓝色和绿色,那么粉刷的成本是10,是最少的成本。

分析:确定状态转移方程

用i表示房子,f(颜色)(i)表示最小花费,costs[][]表示当前房子当前颜色的话费

f(颜色)(i) = Math.min( f(其他颜色)(i-1) , f(其他颜色)(i-1) ) + costs[当前房子][当前颜色]

java 复制代码
public class Test {
    public static void main(String[] args) {
        int[][] costs = {
            {17, 2, 16},
            {15, 14, 5},
            {13, 3, 1}};
        int result = minCost(costs);
        System.out.println(result);

    }

    public static int minCost(int[][] costs) {
        if (costs.length == 0) {
            return 0;
        }

        // 3:需要记录3种颜色的花费
        // 2:只需要记录上一栋房子和当前房子的花费
        int[][] dp = new int[3][2];
        for (int j = 0; j < 3; j++) {// 记录第一栋房子3中颜色的花费
            dp[j][0] = costs[0][j];
        }

        for (int i = 1; i < costs.length; i++) {// 遍历房子
            for (int j = 0; j < 3; j++) {// 遍历颜色
                // [(j+2)%3]:其他颜色的意思
                // [(i-1)%2]:上一栋房子的意思
                int prev1 = dp[(j + 2) % 3][(i - 1) % 2];
                int prev2 = dp[(j + 1) % 3][(i - 1) % 2];
                dp[j][i % 2] = Math.min(prev1, prev2) + costs[i][j];
            }
        }

        int last = (costs.length - 1) % 2;// 最后的房子
        // dp[0][last]、dp[1][last]、dp[2][last]:表示3种颜色,取最小值
        return Math.min(dp[0][last], Math.min(dp[1][last], dp[2][last]));
    }

}
相关推荐
新晓·故知22 分钟前
<基于递归实现线索二叉树的构造及遍历算法探讨>
数据结构·经验分享·笔记·算法·链表
总裁余(余登武)33 分钟前
算法竞赛(Python)-万变中的不变“随机算法”
开发语言·python·算法
Eric.Lee20211 小时前
音频文件重采样 - python 实现
人工智能·python·深度学习·算法·audio·音频重采样
huapiaoy1 小时前
Redis中数据类型的使用(hash和list)
redis·算法·哈希算法
冷白白1 小时前
【C++】C++对象初探及友元
c语言·开发语言·c++·算法
鹤上听雷1 小时前
【AGC005D】~K Perm Counting(计数抽象成图)
算法
一叶祇秋2 小时前
Leetcode - 周赛417
算法·leetcode·职场和发展
武昌库里写JAVA2 小时前
【Java】Java面试题笔试
c语言·开发语言·数据结构·算法·二维数组
ya888g2 小时前
GESP C++四级样题卷
java·c++·算法
Funny_AI_LAB2 小时前
MetaAI最新开源Llama3.2亮点及使用指南
算法·计算机视觉·语言模型·llama·facebook