面试算法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]));
    }

}
相关推荐
昵称小白4 小时前
复杂度分析方法
算法
科研前沿4 小时前
2026 数字孪生前沿科技:全景迭代报告 —— 镜像视界生成式孪生(Generative DT)技术白皮书
大数据·人工智能·科技·算法·音视频·空间计算
学涯乐码堂主6 小时前
有趣的“打擂台算法”
c++·算法·青少年编程·gesp
Tutankaaa7 小时前
知识竞赛题库设计全攻略
人工智能·算法
WolfGang0073217 小时前
代码随想录算法训练营 Day50 | 图论 part08
数据结构·算法·图论
aini_lovee9 小时前
多目标粒子群优化(MOPSO)双适应度函数MATLAB实现
人工智能·算法·matlab
yong99909 小时前
图像融合与拼接:完整MATLAB工具箱
算法·计算机视觉·matlab
春风不语5059 小时前
深入理解主成分分析(PCA)
算法
apollowing9 小时前
启发式算法WebApp实验室:从搜索策略到群体智能的能力进阶(二十二)
算法·启发式算法·web app
晚枫歌F9 小时前
最小堆定时器
数据结构·算法