面试算法91:粉刷房子

题目

一排n幢房子要粉刷成红色、绿色和蓝色,不同房子被粉刷成不同颜色的成本不同。用一个n×3的数组表示n幢房子分别用3种颜色粉刷的成本。要求任意相邻的两幢房子的颜色都不一样,请计算粉刷这n幢房子的最少成本。例如,粉刷3幢房子的成本分别为\[17,2,1615,14,513,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]));
    }

}
相关推荐
林森lsjs5 小时前
零基础吃透二叉树:定义、遍历与高频算法 —数据结构柒
java·开发语言·数据结构·算法·二叉树
船厂电气自动化ai大模型5 小时前
AI大模型与数学·第56课 快速傅里叶变换FFT:DFT高效优化算法,图像、音频、扩散模型工程加速核心工具
数据结构·人工智能·深度学习·算法·机器学习
203号居民5 小时前
【无标题】LeetCode hot 100 —54. 螺旋矩阵
算法
ai产品老杨5 小时前
越界检测算法接入 AI 视频分析平台的流程与误报优化指南
人工智能·算法·音视频
bluesky9612225 小时前
malloc 和 realloc C/C++
c语言·c++·算法
M78佐菲6 小时前
Linux学习笔记:进程回收、exec函数簇与线程
linux·笔记·学习·算法
linux-hzh6 小时前
百日算法修炼 · Day 18
算法
用户813267933256 小时前
Python 计算盘中 VWAP:为什么 1 分钟 K 线是量化工程中的高性价比选择
后端·算法·github
高频因子挖掘机6 小时前
Python批量获取1000只ETF 5分钟K线:从分页到吞吐量优化的QuantDash实践
后端·算法·github
额额额对了6 小时前
Linux C 多线程编程基础:从内存模型到生命周期管理
linux·开发语言·算法