leetcode 1473. Paint House III(粉刷房子III)

基于YOLO+DeepSeek的农作物病虫害检测系统 本系统是一个基于YOLO+DeepSeek的农作物病虫害检测系统。 可使用YOLOV1-YOLOV12的任意模型进行目标检测。可以实现检测图片、批量检测图片、视频检测、摄像头检测四种方式。 阅读详情

There is a row of m houses in a small city, each house must be painted with one of the n colors (labeled from 1 to n), some houses that have been painted last summer should not be painted again.

A neighborhood is a maximal group of continuous houses that are painted with the same color.

For example: houses = [1,2,2,3,3,2,1,1] contains 5 neighborhoods [{1}, {2,2}, {3,3}, {2}, {1,1}].
Given an array houses, an m x n matrix cost and an integer target where:

houses[i]: is the color of the house i, and 0 if the house is not painted yet.
cost[i][j]: is the cost of paint the house i with the color j + 1.
Return the minimum cost of painting all the remaining houses in such a way that there are exactly target neighborhoods. If it is not possible, return -1.

Example 1:

Input: houses = [0,0,0,0,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3
Output: 9
Explanation: Paint houses of this way [1,2,2,1,1]
This array contains target = 3 neighborhoods, [{1}, {2,2}, {1,1}].
Cost of paint all houses (1 + 1 + 1 + 1 + 5) = 9.
Example 2:

Input: houses = [0,2,1,2,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3
Output: 11
Explanation: Some houses are already painted, Paint the houses of this way [2,2,1,2,2]
This array contains target = 3 neighborhoods, [{2,2}, {1}, {2,2}].
Cost of paint the first and last house (10 + 1) = 11.

houses数组中的数字表示第i 个房子的颜色,一共m个房子。
把连续相同颜色的分为1组,那么houses = [1,2,2,3,3,2,1,1] 这种的就分为5组 [{1}, {2,2}, {3,3}, {2}, {1,1}].

现在要把houses分成target个组,就需要把houses刷上不同的颜色以达到目的,
cost中就有n个颜色,cost = [[1,10],[10,1],[10,1],[1,10],[5,1]]这个的意思就是给第1个房子刷颜色1需要的cost是1,刷颜色2的cost是10,
同样的,给第2个房子刷1的cost是10,刷2cost是1,cost[i][j]就是第i个房子刷j+1颜色的cost

如果第i 个house已经有颜色(house[i] != 0), 保持原来的颜色,不再刷新的颜色。是0才能刷新的颜色。

求能分为target个组需要的cost, 如果不能达到,返回-1.

思路:

DP
变量较多,属于高维度DP,比较有难度。

先理一下变量,总的来说有3个变量,m个房子,n种颜色,要分为target个组。
定义dp[target+1][m+1][n+1]

首先,m和n都是>=1的,那么在它们为0时是不需要刷颜色的,cost=0
所以dp[0][0][*] = 0.

然后来看状态转移:
dp[k][i][ci] 表示 把house分为k个组,用前 i 个房子,第i个房子的颜色为ci,需要的cost

现在从dp[k-1][i-1][c_i-1]出发,假如第 i 个颜色 ci != c_i-1,那么就会形成一个新的组,现在有i个房子
于是dp[k-1][i-1][c_i-1]就转变为dp[k][i][ci]
如果ci == c_i-1, 就不会形成新的组,dp[k][i-1][c_i-1] 会变成 dp[k][i][ci]
那还要加上刷ci颜色的cost, 如果house已经有颜色了,不用刷,cost=0,
反之,house没有颜色,需要刷,则cost = cost[i][ci]
总结一下,状态转移为:
dp[k][i][ci] = min(dp[k][i][ci], dp[k - (ci != c_i-1)][i-1][c_i-1] + cost)

最后要返回的是最后一个房子在所有颜色中cost最小的那个,也就是min(dp[target][m])

可能还是比较难理解,在代码中再次给出注释

代码中要注意下标,题目中的房子,颜色都是从1开始的,而数组下标是从0开始。

    public int minCost(int[] houses, int[][] cost, int m, int n, int target) {
        int INF = 1000000007;
        int res = -1;
        //target是多少个neighbors, m是多少个房子,n是多少种颜色
        int[][][] dp = new int[target+1][m+1][n+1];
        
        for(int i = 0; i <= target; i++) {
            for(int j = 0; j <= m; j++) {
                //m,n都>=1,所以m=0,n=0处不管什么颜色cost都是0
                if(i == 0 && j == 0) continue;
                Arrays.fill(dp[i][j], INF);
            }
        }
        
        //dp[k][i][c]表示用前i个house形成k个group的cost, 第i个house的颜色是c
        //状态转移:
        //如果c_i != c_i-1, 那么dp[k-1][i-1][c_i-1]到dp[k][i][c_i]
        //如果c_i == c_i-1, 那么组数没有增加:dp[k][i-1][c_i-1]到dp[k][i][c_i]
        //如果房子已经有颜色,那本次不再刷颜色:if(houses[i]!=0) cost = 0 else cost[i][c_i]
        //因此dp[k][i][c_i] = min(dp[k-1][i-1][c_i-1], dp[k][i-1][c_i-1]) + cost
        
        for(int k = 1; k <= target; k++) {
            for(int i = k; i <= m; i++) {  //k个group至少要k个house,剪枝
                int hi = houses[i-1];  //第i个house的颜色,数组下标是0开始,所以-1
                //j表示i-1
                int hj = i > 1 ? houses[i-2] : 0; //第i-1个house的颜色,数组下标是0开始,所以-1
                int si, ei, sj, ej;  //遍历起点,终点
                //剪枝:house没有颜色时需要遍历颜色,有颜色时就固定在现在的颜色
                if(hi == 0) {
                    si = 1;
                    ei = n;
                } else {
                    si = hi;
                    ei = hi;
                }
                
                if(hj == 0) {
                    sj = 1;
                    ej = n;
                } else {
                    sj = hj;
                    ej = hj;
                }
                
                for(int ci = si; ci <= ei; ci ++) {
                    //color是从1~n,而数组下标从0开始
                    int val = (ci == hi ? 0 : cost[i-1][ci-1]);
                    for(int cj = sj; cj <= ej; cj++) {
                        int diff = ci == cj ? 0 : 1;
                        dp[k][i][ci] = Math.min(dp[k][i][ci], dp[k-diff][i-1][cj] + val);
                    }
                }
                
            }
        }
        res = Arrays.stream(dp[target][m]).min().getAsInt();
        return res == INF ? -1 : res;
    }
130、NPU的仿真测试:使用Gem5进行全系统仿真 这篇文章摘要(149字): 本文分享了使用Gem5全系统仿真器验证NPU设计的实践经验。作者通过搭建自定义NPU模型并集成到Gem5系统中,实现了CPU-NPU-内存协同仿真。关键点包括:1) 使用SimObject机制构建可配置的NPU模型;2) 合理配置IO和内存总线避免访问冲突;3) 开发Linux驱动实现CPU与NPU通信;4) 利用Gem5调试功能监控内部状态。相比RTL仿真和FPGA验证,该方法能快速验证微架构设计并定位系统级问题,有效减少了流片风险。文章特别强调了时钟域配置、总线仲裁、对齐访问 阅读详情

相关推荐

多租户Saas架构设计分析(基础篇)

本篇先给大家介绍一下相关的概念和常见问题。 实践篇链接:https://blog.csdn.net/haponchang/article/details/104246317 SaaS简介 SaaS是Software-as-a-Service(软件即服务)的简称,“软件即服务”?是不是有点拗口?其实你就理解成为“按需租用别人提供的软件服务”就可以了,它是一种软件交付模式。...

haponchang的博客 1万+

LeetCode 力扣官方题解 | 剑指 Offer II 091. 粉刷房子

对于 1≤i

weixin_44071377的博客 553

智能车八邻域图像算法_二

智能车八邻域图像算法 文章目录智能车八邻域图像算法前言一、一些想法二、生长方向的使用1.点的生长方向的表示2. 用点的生长方向来做初步判断1.引入库2.读入数据总结 前言 上一篇里面讲过用八邻域来获得赛道边界:智能车八邻域图像算法 当已经能稳定获得赛道边界时,就可以进行元素识别,获得偏差了。 这里就介绍一下我的一些思路。 早在前两年,优快云上就有一篇关于八邻域如何处理元素的文章第十五届全国大学生智能汽车竞赛-双车组三轮图像处理总结,写得很好,我当时也参考了这篇文章,但是我觉得不是很详细,所以我这里想写得

技术缝合怪的博客 1万+

【LeetCode256】粉刷房子

1.题目描述 假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个n x 3的矩阵来表示的。 例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[...

u011646912的博客 1455

机器学习模型系列:随机森林的原理和示例介绍

让我们总结一下与其他监督式机器学习模型相比,随机森林的优缺点。优点在许多真实数据集上已知能提供高度准确的模型。通过结合多个决策树的预测,可以捕捉数据集中的复杂交互和模式。通过自动选择相关特征,可以有效处理高维数据集。与单个决策树相比,不容易过拟合。自助采样和每个节点的随机特征选择有助于减少过拟合并改善泛化能力。可以处理包括数值和分类特征在内的异构数据类型。可以处理缺失值而不需要填充。提供特征重要性的度量。集成中的树可以并行训练,因为每个决策树可以独立构建。模型的泛化误差具有理论上的界限。

数智笔记 1万+

LeetCode题解(0256):粉刷房子(Python)

题目:原题链接(中等) 标签:动态规划 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(N×M)O(N×M)O(N×M) O(N×M)O(N×M)O(N×M) 64ms (8.93%) Ans 2 (Python) Ans 3 (Python) 解法一: class Solution: def minCost(self, costs: List[List[int]]) -> int: if not costs o

长行 606

Rockchip平台Android相机HAL3开发实战:从配置到调试全流程解析

本文深入解析了Rockchip平台Android相机HAL3的开发全流程。从理解AAL与PSL核心架构、解析关键配置文件(如camera3_profiles.xml和Tuning文件),到搭建编译环境、进行增量部署,并提供了系统日志分析、V4L2调试等高级问题排查技巧,为开发者提供了一套从配置到调试的实战指南。

docker7nomad的博客 842

leetcode1473 - 粉刷房子 III(三维动态规划,如何实现?)

leetcode1473 - 粉刷房子 III(三维动态规划,如何实现?)介绍题目题目理解解题分析代码致谢题解参考 介绍 我的LeetCode主页,一题一题解 标签:动态规划 1473. 粉刷房子 III 难度 困难 1473. 粉刷房子 III: https://leetcode-cn.com/problems/paint-house-iii/ 题目 在一个小城市里,有 m 个房子排成一排,你需要给每个房子涂上 n 种颜色之一(颜色编号为 1 到 n )。有的房子去年夏天已经涂过颜色了,所以这些房子不

Alivorth的博客 1016

深入解析STM32定时器中央对齐模式3的双中断机制

本文深入解析了STM32定时器中央对齐模式3的双中断机制。该模式在一个PWM周期内,会在计数器到达ARR(上溢)和0(下溢)时各触发一次更新中断,实现更精细的实时控制。文章详细阐述了其工作原理、配置方法,并指导如何在中断服务函数中通过DIR位区分中断来源,同时探讨了其在电机控制、数字电源等场景下的应用优势与CPU负载挑战。

weixin_29164185的博客 492

2026华为OD面试手撕代码真题目录

一般面试的时候每一轮技术面都会出一到两个手撕代码题,这些题的特点就是,非常短小,易于理解。不可能会再出阅读理解一样的机试题的。但是这些题目也非常注意基本功,很注意细节的处理,一般都是easy+medium题目。但是大家一定要注意,因为大部分面试官上面一开始就会让你做题,直接看你所有的做题过程(防止有人水平一般,机试就网上找的答案的蒙混过关),手撕代码题会给你后面的面试定一个基调。

MISAYAONE的博客 9万+

【Leetcode】256. Paint House

题目地址: https://leetcode.com/problems/paint-house/ 给定一个二维数组,第iii行代表房子iii用颜色kkk刷漆需要的费用。要求相邻的房子不能刷同样颜色的漆。问粉刷所有的房子需要的最小费用是多少。 思路是动态规划。令f[i][j]f[i][j]f[i][j]表示第iii个房子用第jjj种漆刷的情况下,第0...i0...i0...i刷漆的总费用。那么有f...

数学、算法爱好者的博客 376

AgentScope Java 入门:Spring AI Alibaba 与 AgentScope 的定位与区别

摘要:Spring AI Alibaba是阿里基于Spring AI开发的本地化AI应用框架,旨在服务Java开发者。它提供模型接入、函数调用、RAG等功能,并与阿里云基础设施深度集成。同时,阿里开源了多智能体框架AgentScope,其Java版(AgentScope-Java)专注于Agentic设计理念。两者将协同发展:Spring AI Alibaba侧重Spring生态集成,AgentScope-Java强化智能体能力。未来计划包括支持AgentScope、升级Admin平台,以及推进Server

SmartSi 1522

leetcode 困难题 1473. Paint House III 粉刷房子 III

Problem:动态规划的呢,dp[i][j][k]表示前i个houses、共j个邻居、第i个house粉刷的颜色k初始条件是:若houses[0]!=0则dp[1][1][houses[0]] = 0;否则 dp[1][1][k] = cost[0][k-1];三重基本循环的,j的上界是:r = min(i, target);递推公式是这个:也就是k和w不相同,则拿到最小值 dp[i-1][j-1][w],第i-1个house粉刷颜色w,若k==w的话此时j不变。

邹九的个人博客 547

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

LeetCode——1473. 粉刷房子 III(Paint House III)[困难]——分析及代码(Java)

LeetCode——1473. 粉刷房子 III[Paint House III][困难]——分析及代码[Java]一、题目二、分析及代码1. 动态规划(1)思路(2)代码(3)结果三、其他 一、题目 在一个小城市里,有 m 个房子排成一排,你需要给每个房子涂上 n 种颜色之一(颜色编号为 1 到 n )。有的房子去年夏天已经涂过颜色了,所以这些房子不需要被重新涂色。 我们将连续相同颜色尽可能多的房子称为一个街区。(比方说 houses = [1,2,2,3,3,2,

江南土豆的博客 746

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

leetcode1473. 给房子涂色 III

leetcode1473. 给房子涂色 III 在一个小城市里,有 m 个房子排成一排,你需要给每个房子涂上 n 种颜色之一(颜色编号为 1 到 n )。有的房子去年夏天已经涂过颜色了,所以这些房子不需要被重新涂色。 我们将连续相同颜色尽可能多的房子称为一个街区。(比方说 houses = [1,2,2,3,3,2,1,1] ,它包含 5 个街区 [{1}, {2,2}, {3,3}, {2}, {1,1}] 。) 给你一个数组 houses ,一个 m * n 的矩阵 cost 和一个整数 target

weixin_43422466的博客 585

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

LeetCode1473. 粉刷房子 III(三维动态规划)

链接:https://leetcode-cn.com/problems/paint-house-iii/solution/javasan-wei-dong-tai-gui-hua-by-oyzg-qujd/ 解题思路 参考Qian神的讲解https://leetcode-cn.com/problems/paint-house-iii/solution/c-san-wei-dong-tai-gui-hua-by-qiank-yn5l/ 1.dp[i][j][k]代表前i个房子组成j个街区,且第i个房子颜色为k

weixin_46100881的博客 245

LeetCode 1473. 给房子涂色 III(DP)

1. 题目 在一个小城市里,有 m 个房子排成一排,你需要给每个房子涂上 n 种颜色之一(颜色编号为 1 到 n )。 有的房子去年夏天已经涂过颜色了,所以这些房子不需要被重新涂色。 我们将连续相同颜色尽可能多的房子称为一个街区。(比方说 houses = [1,2,2,3,3,2,1,1] ,它包含 5 个街区 [{1}, {2,2}, {3,3}, {2}, {1,1}] 。) 给你一个数组 houses ,一个 m * n 的矩阵 cost 和一个整数 target ,其中: houses[i]:

Michael是个半路程序员 2899

leetcode1473. 粉刷房子 III(超难的三维dp问题)

1473. 粉刷房子 III 题目 在一个小城市里,有 m 个房子排成一排,你需要给每个房子涂上 n 种颜色之一(颜色编号为 1 到 n )。有的房子去年夏天已经涂过颜色了,所以这些房子不需要被重新涂色。 我们将连续相同颜色尽可能多的房子称为一个街区。(比方说 houses = [1,2,2,3,3,2,1,1] ,它包含 5 个街区 [{1}, {2,2}, {3,3}, {2}, {1,1}] 。) 给你一个数组 houses ,一个 m * n 的矩阵 cost 和一个整数 target ,其中:

qq_45818845的博客 310

1473. Paint House III(Leetcode每日一题-2021.05.04)--抄答案

Problem There is a row of m houses in a small city, each house must be painted with one of the n colors (labeled from 1 to n), some houses that have been painted last summer should not be painted again. A neighborhood is a maximal group of continuous house

Bryan要加油 488

leetcode256 粉刷房子 paint-house(dfs or dp)

定义 dp[i][j] 表示前 i 个房子在最后一个房子选择颜色 j 的情况下的总成本。一般的dp,dp[n]=f(dp[n-1], dp[n-2], ……调用方式:void dfs( nums, 0,0)颜色不重复需要另一个纬度的控制,所以是二维动态规划。dfs ,还需要一个保存当前结果的值sum。dfs ,需要有一个记录深度的index。

ResumeProject的博客 387

Leetcode 256.粉刷房子

Time: 20190903 Type: Easy 题目描述 假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。 当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的矩阵来表示的。 例如,costs[0][0] 表示第 0 ...

Bing's Blog 3403

Leetcode 3429. Paint House IV

Leetcode 3429. Paint House IV

codename_cys的博客 436

Leetcode学习笔记(粉刷房子)

091. 粉刷房子 用矩阵spend记录下来当前的最小花费,spend[i][1]表示第i个房子涂成蓝色时共支出的最小花费 class Solution: def minCost(self, costs: List[List[int]]) -> int: spend = costs i = 1 n = len(costs) while i < n: spend[i][0] = min(spend[i

2023好运来的博客 441

[LeetCode] Paint House 粉刷房子

  There are a row of n houses, each house can be painted with one of the three colors: red, blue or green. The cost of painting each house with a certain color is different. You have to paint all the...

weixin_33862993的博客 288

LeetCode 每日一题 1473. 粉刷房子 III

1473. 粉刷房子 III 在一个小城市里,有 m 个房子排成一排,你需要给每个房子涂上 n 种颜色之一(颜色编号为 1 到 n )。有的房子去年夏天已经涂过颜色了,所以这些房子不需要被重新涂色。 我们将连续相同颜色尽可能多的房子称为一个街区。(比方说 houses = [1,2,2,3,3,2,1,1] ,它包含 5 个街区 [{1}, {2,2}, {3,3}, {2}, {1,1}] 。) 给你一个数组 houses ,一个 m * n 的矩阵 cost 和一个整数 target ,其中: ho

雷震子的博客 312
上一篇: Semantic SLAM源码解析
下一篇: yolov7 paper阅读笔记
蓝羽飞鸟
博客等级 码龄8年 1万+粉丝 727原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值