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

}
相关推荐
yi0112 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
灯澜忆梦5 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下5 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J5 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛5 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有6 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu1111116 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS6 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b6 小时前
算法日常・每日刷题--<动态规划>14
算法
赛博守夜人6 小时前
跨境业务与出海合规之九:海外买量投放与营销虚假流量(Ad Fraud):跨国机房群控与归因欺诈识别算法
算法·安全