leetcode 1473. 粉刷房子 III(dp)

在一個小城市里,有 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]:是第 i 個房子的顏色,0 表示這個房子還沒有被涂色。
cost[i][j]:是將第 i 個房子涂成顏色 j+1 的花費。
請你返回房子涂色方案的最小總花費,使得每個房子都被涂色后,恰好組成 target 個街區。如果沒有可用的涂色方案,請返回 -1 。

示例 1:

輸入:houses = [0,0,0,0,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3
輸出:9
解釋:房子涂色方案為 [1,2,2,1,1]
此方案包含 target = 3 個街區,分別是 [{1}, {2,2}, {1,1}]。
涂色的總花費為 (1 + 1 + 1 + 1 + 5) = 9。
示例 2:

輸入:houses = [0,2,1,2,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3
輸出:11
解釋:有的房子已經被涂色了,在此基礎上涂色方案為 [2,2,1,2,2]
此方案包含 target = 3 個街區,分別是 [{2,2}, {1}, {2,2}]。
給第一個和最后一個房子涂色的花費為 (10 + 1) = 11。
示例 3:

輸入:houses = [0,0,0,0,0], cost = [[1,10],[10,1],[1,10],[10,1],[1,10]], m = 5, n = 2, target = 5
輸出:5
示例 4:

輸入:houses = [3,1,2,3], cost = [[1,1,1],[1,1,1],[1,1,1],[1,1,1]], m = 4, n = 3, target = 3
輸出:-1
解釋:房子已經被涂色并組成了 4 個街區,分別是 [{3},{1},{2},{3}] ,無法形成 target = 3 個街區。

解題思路

數組dp[i][j][k]中存儲的元素含義是前i座房子并且第i座房子的顏色是j并且街區數目為k時,產生的最小花費

代碼解讀

1.這段代碼作用是將房子的顏色從0開始編號,使得后面顏色的遍歷直接從0開始

        for (int i = 0; i < houses.length; i++) {houses[i]--;}

2.這段代碼作用是初始化dp數組,將全部元素置為最大值,因為題目需要選出的時最小值,因此沒有填入元素的位置即為最大值,后面在比較的時候就會失效

        for (int i = 0; i <m ; i++) {for(int j=0;j<n;j++)Arrays.fill(dp[i][j],max);}

3.狀態轉移

        for (int i = 0; i <m ; i++) {//遍歷所有房子for(int j=0;j<n;j++){//遍歷所有顏色if(houses[i]!=-1&&houses[i]!=j)  continue;
//條件等價于houses[i]==-1||houses[i]==j,就直接下一輪循環
//houses[i]==-1代表房子沒上色,houses[i]==j代表當前房子已經上色并且顏色是j,因為顏色已經固定了,所以
//dp[i][j][k]只能在j==houses[i]的情況下填入元素,顏色j等于其他值的情況是不可能出現for (int k = 0; k < target; k++) {//遍歷街區個數for (int p = 0; p < n; p++) {//遍歷前一個房子的顏色//先分為兩種情況 //情況一:前一個房子和當前房子同色//情況二:前一個房子和當前房子不同色   if (p==j)//情況一:前一個房子和當前房子同色{if(i==0)//1.當前房子是第一家,因此不能從前一座房子轉移狀態{if(k==0)//當前街區數只可能為0,因為當前只有一家房子,不可能產生k>0 dp[i][j][k]=0;}else{//2.當前房子不是第一家dp[i][j][k]= Math.min(dp[i][j][k],dp[i-1][j][k]);//因為前一個房子和當前房子同色,因此街區數是沒有增加的,顏色也是和前面房子的一樣}}else if(i>0&&k>0){//情況二:前一個房子和當前房子不同色dp[i][j][k]= Math.min(dp[i][j][k],dp[i-1][p][k-1]);//因為當前房子和前一個房子,顏色不一樣,因此需要產生一個新的街區}}if(houses[i]==-1&&dp[i][j][k]!=max)
//houses[i]==-1代表房子沒上色,dp[i][j][k]!=max 代表從前面的循環中是不能向dp[i][j][k]填入元素的
//例如 dp[0][j][k](k>1) 這種情況是不可能出現的,因此不能填入元素,也不能在計算這種情況的花費dp[i][j][k]+=cost[i][j];}}}

4.dp[m-1][i][target-1],m-1代表所有房子(前m座房子),target-1代表有target個街區,i是最后一個房子的顏色,找出最小值。

        for (int i = 0; i < n; i++) {res= Math.min(res,dp[m-1][i][target-1]);}

代碼

class Solution {static int max=Integer.MAX_VALUE/2;public int minCost(int[] houses, int[][] cost, int m, int n, int target) {int[][][] dp=new int[m][n][target];for (int i = 0; i < houses.length; i++) {houses[i]--;}for (int i = 0; i <m ; i++) {for(int j=0;j<n;j++)Arrays.fill(dp[i][j],max);}for (int i = 0; i <m ; i++) {for(int j=0;j<n;j++){if(houses[i]!=-1&&houses[i]!=j)  continue;for (int k = 0; k < target; k++) {for (int p = 0; p < n; p++) {if (p==j){if(i==0){if(k==0)   dp[i][j][k]=0;}else{dp[i][j][k]= Math.min(dp[i][j][k],dp[i-1][j][k]);}}else if(i>0&&k>0){dp[i][j][k]= Math.min(dp[i][j][k],dp[i-1][p][k-1]);}}if(houses[i]==-1&&dp[i][j][k]!=max)dp[i][j][k]+=cost[i][j];}}}int res=max;for (int i = 0; i < n; i++) {res= Math.min(res,dp[m-1][i][target-1]);}return res==max?-1:res;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/391191.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/391191.shtml
英文地址,請注明出處:http://en.pswp.cn/news/391191.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大學生信息安全_給大學生的信息

大學生信息安全You’re an undergraduate. Either you’re graduating soon (like me) or you’re in the process of getting your first college degree. The process is not easy and I can only assume how difficult the pressures on Masters and Ph.D. students are. Ho…

打破冷漠僵局文章_保持冷靜并打破僵局-最佳

打破冷漠僵局文章Hack The Box (HTB) is an online platform allowing you to test your penetration testing skills. It contains several challenges that are constantly updated. Some of them simulating real world scenarios and some of them leaning more towards a …

使用DOM Breakpoints找到修改屬性的Javascript代碼

使用Chrome開發者工具的DOM斷點功能可以讓您快速找到修改了某一個DOM元素的Javascript代碼。 在Chrome開發者工具里&#xff0c;選中想要監控的DOM元素&#xff0c;點擊右鍵&#xff0c;選擇Break on->Attributes modifications: 之后在DOM Breakpoints的tab里能看到對應的斷…

特斯拉最安全的車_特斯拉現在是最受歡迎的租車選擇

特斯拉最安全的車Have you been curious to know which cars are most popular in US and what are their typical rental fares in various cities? As the head of Product and Data Science at an emerging technology start-up, Ving Rides, these were some of the quest…

leetcode 740. 刪除并獲得點數(dp)

給你一個整數數組 nums &#xff0c;你可以對它進行一些操作。 每次操作中&#xff0c;選擇任意一個 nums[i] &#xff0c;刪除它并獲得 nums[i] 的點數。之后&#xff0c;你必須刪除每個等于 nums[i] - 1 或 nums[i] 1 的元素。 開始你擁有 0 個點數。返回你能通過這些操作…

WebSocket入門

WebSocket前言  WebSocket是HTML5的重要特性&#xff0c;它實現了基于瀏覽器的遠程socket&#xff0c;它使瀏覽器和服務器可以進行全雙工通信&#xff0c;許多瀏覽器&#xff08;Firefox、Google Chrome和Safari&#xff09;都已對此做了支持。 在WebSocket出現之前&#xff…

安卓游戲開發推箱子_保持冷靜并砍箱子-開發

安卓游戲開發推箱子Hack The Box (HTB) is an online platform allowing you to test your penetration testing skills. It contains several challenges that are constantly updated. Some of them simulating real world scenarios and some of them leaning more towards …

自定義TabLayout

本文為kotlin仿開眼視頻Android客戶端的后續補充內容&#xff0c;本篇為大家介紹如何對TabLayout進行定制使用&#xff0c;基于項目需求&#xff0c;本篇主要對部分功能進行了定制&#xff0c;如&#xff1a;指示器距離文字的距離、文字選中加粗、文字選中變大等 本文部分代碼參…

ml dl el學習_DeepChem —在生命科學和化學信息學中使用ML和DL的框架

ml dl el學習Application of Machine Learning and Deep Learning for Drug Discovery, Genomics, Microsocopy and Quantum Chemistry can create radical impact and holds the potential to significantly accelerate the process of medical research and vaccine developm…

響應式網站設計_通過這個免費的四小時課程,掌握響應式網站設計

響應式網站設計This video tutorial from Kevin Powell teaches you to build responsive websites from scratch. 凱文鮑威爾(Kevin Powell)的這段視頻教程教您從頭開始構建響應式網站。 The course starts with explaining the core concepts needed to start thinking resp…

2017-2018-1 20179215《Linux內核原理與分析》第二周作業

20179215《Linux內核原理與分析》第二周作業 這一周主要了解了計算機是如何工作的&#xff0c;包括現在存儲程序計算機的工作模型、X86匯編指令包括幾種內存地址的尋址方式和push、pop、call、re等幾個重要的匯編指令。主要分為兩部分進行這周的學習總結。第一部分對學習內容進…

python:單例模式--使用__new__(cls)實現

單例模式&#xff1a;即一個類有且僅有一個實例。 那么通過python怎么實現一個類只能有一個實例呢。 class Earth:"""假如你是神&#xff0c;你可以創造地球"""print 歡迎來到地球# 生成一個地球 a Earth() print id(a)# 再生成一個地球 b Ear…

重學TCP協議(5) 自連接

1.自連接是什么 在發起連接時&#xff0c;TCP/IP的協議棧會先選擇source IP和source port&#xff0c;在沒有顯示調用bind()的情況下&#xff0c;source IP由路由表確定&#xff0c;source port由TCP/IP協議棧從local port range中選取尚未使用的port。 如果destination IP正…

Gradle復制文件/目錄方法

2019獨角獸企業重金招聘Python工程師標準>>> gradle復制文件/文件夾方法 復制文件 //復制IDE生成的classes.jar文件到build/libs中&#xff0c;并改名為FileUtils.jar. task copyFile(type:Copy) {delete build/libs/FileUtils.jarfrom(build/intermediates/bundles…

用戶參與度與活躍度的區別_用戶參與度突然下降

用戶參與度與活躍度的區別disclaimer: I don’t work for Yammer, this is a public data case study, I’ve written it in a narrative format to make this case study more engaging to read.免責聲明&#xff1a;我不為Yammer工作&#xff0c;這是一個公共數據案例研究&am…

python:__new__()與__init__()

參考&#xff1a;https://blog.csdn.net/qq_41020281/article/details/79638370 轉載于:https://www.cnblogs.com/gcgc/p/11585599.html

重學TCP協議(6) 四次揮手

1. 四次揮手 客戶端進程發出連接釋放報文&#xff0c;并且停止發送數據。釋放數據報文首部&#xff0c;FIN1&#xff0c;其序列號為sequ&#xff08;等于前面已經傳送過來的數據的最后一個字節的序號加1&#xff09;&#xff0c;此時&#xff0c;客戶端進入FIN-WAIT-1&#xff…

mysql數據庫部分操作指令

用cmd開啟服務時拒絕訪問. 原因:不是管理員用戶&#xff0c;沒有權限 將服務中的 MySQL設置為手動啟動&#xff0c; 否則 開機自動啟動. 啟動mysql服務&#xff0c;用管理員權限打開dos界面 windowsX A 打開開始界面 點擊管理員開啟cmd 啟動服務&#xff1a;net start …

推箱子2-向右推!_保持冷靜并砍箱子-嗶

推箱子2-向右推!Hack The Box (HTB) is an online platform allowing you to test your penetration testing skills. It contains several challenges that are constantly updated. Some of them simulating real world scenarios and some of them leaning more towards a C…

UML建模圖實戰筆記

一、前言 UML&#xff1a;Unified Modeling Language&#xff08;統一建模語言&#xff09;&#xff0c;使用UML進行建模的作用有哪些&#xff1a; 可以更好的理解問題可以及早的發現錯誤或者被遺漏的點可以更加方便的進行組員之間的溝通支持面向對象軟件開發建模&#xff0c;可…