在一个小城市里,有 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 表示这个房子还没有被涂色。 示例 1: 输入:houses = [0,0,0,0,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3 输入:houses = [0,2,1,2,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3 输入:houses = [0,0,0,0,0], cost = [[1,10],[10,1],[1,10],[10,1],[1,10]], m = 5, n = 2, target = 5 输入:houses = [3,1,2,3], cost = [[1,1,1],[1,1,1],[1,1,1],[1,1,1]], m = 4, n = 3, target = 3 提示: m == houses.length == cost.length 我比赛提交的的代码: 结果是解答错误,加上第九行 if(houses[m]>0 && houses[m]!=nn)return maxint; 解决了计算错误的问题,但是超时了。 仔细一分析,在于我的maxint这个值既用作初始值,也用作表示无解的-1,造成了混乱。 要区分这个,我加了一行,改了一行,代码变成: 这个是AC的
cost[i][j]:是将第 i 个房子涂成颜色 j+1 的花费。
请你返回房子涂色方案的最小总花费,使得每个房子都被涂色后,恰好组成 target 个街区。如果没有可用的涂色方案,请返回 -1 。
输出:9
解释:房子涂色方案为 [1,2,2,1,1]
此方案包含 target = 3 个街区,分别是 [{1}, {2,2}, {1,1}]。
涂色的总花费为 (1 + 1 + 1 + 1 + 5) = 9。
示例 2:
输出:11
解释:有的房子已经被涂色了,在此基础上涂色方案为 [2,2,1,2,2]
此方案包含 target = 3 个街区,分别是 [{2,2}, {1}, {2,2}]。
给第一个和最后一个房子涂色的花费为 (10 + 1) = 11。
示例 3:
输出:5
示例 4:
输出:-1
解释:房子已经被涂色并组成了 4 个街区,分别是 [{3},{1},{2},{3}] ,无法形成 target = 3 个街区。
n == cost[i].length
1 <= m <= 100
1 <= n <= 20
1 <= target <= m
0 <= houses[i] <= n
1 <= cost[i][j] <= 10^4
int maxint=1234567; class Solution { public: int ans[105][22][105]; int dp(vector<int>& houses, vector<vector<int>>& cost, int m, int n,int nn, int target) { if(m==0) { if(target!=1)return maxint; if(houses[m]>0)return 0; return cost[0][nn-1]; } if(target<=0)return maxint; if(ans[m][nn][target]<maxint)return ans[m][nn][target]; if(houses[m]>0 && houses[m]!=nn)return maxint; for(int ni=1;ni<=n;ni++)ans[m][nn][target]=min(ans[m][nn][target],((houses[m]>0)?0:cost[m][nn-1])+dp(houses,cost,m-1,n,ni,target-(ni!=nn))); return ans[m][nn][target]; } int minCost(vector<int>& houses, vector<vector<int>>& cost, int m, int n, int target) { for(int i=0;i<=m;i++)for(int j=0;j<=n;j++)for(int k=0;k<=target;k++)ans[i][j][k]=maxint; int r=maxint; for(int ni=1;ni<=n;ni++)r=min(r,dp(houses,cost,m-1,n,ni,target)); if(r==maxint)return -1; return r; } };
int maxint=1234567; class Solution { public: int ans[105][22][105]; int dp(vector<int>& houses, vector<vector<int>>& cost, int m, int n,int nn, int target) { if(m==0) { if(target!=1)return maxint; if(houses[m]>0 && houses[m]!=nn)return maxint; ////////add if(houses[m]>0)return 0; return cost[0][nn-1]; } if(target<=0)return maxint; if(ans[m][nn][target]<maxint)return ans[m][nn][target]; if(houses[m]>0 && houses[m]!=nn)return maxint; ans[m][nn][target]--; ////////add for(int ni=1;ni<=n;ni++)ans[m][nn][target]=min(ans[m][nn][target],((houses[m]>0)?0:cost[m][nn-1])+dp(houses,cost,m-1,n,ni,target-(ni!=nn))); return ans[m][nn][target]; } int minCost(vector<int>& houses, vector<vector<int>>& cost, int m, int n, int target) { for(int i=0;i<=m;i++)for(int j=0;j<=n;j++)for(int k=0;k<=target;k++)ans[i][j][k]=maxint; int r=maxint; for(int ni=1;ni<=n;ni++)r=min(r,dp(houses,cost,m-1,n,ni,target)); if(r>maxint-2)return -1; ////////modify return r; } };
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算