网易首页 > 网易号 > 正文 申请入驻

2024-04-03:在一个小城市里,有 m 个房子排成一排, 你需要给每

0
分享至

2024-04-03:用go语言,在一个小城市里,有 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。

输入:houses = [0,0,0,0,0], cost = [[1,10],[10,1],[10,1],[1,10],[5,1]], m = 5, n = 2, target = 3。

输出:9。

答案2024-04-03:

来自左程云。

灵捷3.5

大体步骤如下:

minCost1函数:

1.首先,创建一个三维数组dp,用于记录状态转移的结果。dp[i][k][c]表示将前i个房子涂色,形成k个街区,并且第i个房子颜色为c+1时的最小总花费。

2.然后,调用process1函数,进行递归计算。

3.在process1函数中,首先处理边界情况:如果k小于0,返回无穷大;如果i等于房子数量,如果k等于0,返回0,否则返回无穷大。

4.如果dp[i][k][c]已经计算过,直接返回结果。

5.接着,判断第i个房子的颜色是否已经确定(houses[i] != 0):

  • •如果颜色已经确定,判断该颜色是否与c相同,分别递归处理下一个房子(i+1)和剩余街区数量(k-1或k)。
  • •如果颜色未确定,遍历每种可能的颜色(1到n),分别递归处理下一个房子和剩余街区数量,并记录选择花费最小的方案。

6.将结果存入dp[i][k][c],并返回结果。

minCost2函数:

1.创建一个二维数组dp,用于记录状态转移的结果。dp[k][c]表示形成k个街区,且最后一个房子颜色为c+1时的最小总花费。

2.首先初始化dp数组:对于k=0(没有街区)和所有的颜色c,花费为0;对于k>0和所有的颜色c,花费初始化为无穷大。

3.然后,从后向前遍历房子,处理每个房子的情况:

  • •如果房子颜色已经确定(houses[i] != 0),更新dp数组中对应位置的值。
  • •如果房子颜色未确定,通过dp数组中记录的上一次的结果,计算每个街区数量和颜色的最小花费,更新dp数组中对应位置的值。

4.最后,返回dp[target][0]的结果,如果为无穷大则返回-1。

minCost3函数:

1.创建一个二维数组dp,用于记录状态转移的结果。dp[k][c]表示形成k个街区,且最后一个房子颜色为c+1时的最小总花费。

2.首先初始化dp数组和辅助数组minl和minr:

  • •对于k=0(没有街区)和所有的颜色c,花费为0;
  • •对于k>0和所有的颜色c,花费初始化为无穷大;
  • •minl[i]表示前i个颜色中最小的花费,minr[i]表示从第i个颜色到第n个颜色中最小的花费。

3.然后,从后向前遍历房子,处理每个房子的情况:

  • •如果房子颜色已经确定(houses[i] != 0),更新dp数组中对应位置的值。
  • •如果房子颜色未确定,通过dp数组中记录的上一次的结果和辅助数组minl和minr,计算每个街区数量和颜色的最小花费,更新dp数组中对应位置的值。

4.最后,返回dp[target][0]的结果,如果为无穷大则返回-1。

这3种算法的时间复杂度和空间复杂度如下:

  • •minCost1:时间复杂度为O(m * n^target),空间复杂度为O(m * target * n)。
  • •minCost2:时间复杂度为O(m * target * n^2),空间复杂度为O(target * n)。
  • •minCost3:时间复杂度为O(m * target * n^2),空间复杂度为O(n)。

Go完整代码如下:

packagemain
import(
"fmt"
"math"
)
funcminCost1(houses[]int,cost[][]int,mint,nint,targetint)int{
dp:=make([][][]int,m)
fori:=0;idp[i]=make([][]int,target+1)
fork:=0;k<=target;k++{
dp[i][k]=make([]int,n+1)
forc:=0;c<=n;c++{
dp[i][k][c]=-1
}
}
}
ans:=process1(houses,cost,n,0,target,0,dp)
ifans==math.MaxInt32{
return-1
}
returnans
}
funcprocess1(houses[]int,cost[][]int,n,i,k,cint,dp[][][]int)int{
ifk<0{
returnmath.MaxInt32
}
ifi==len(houses){
ifk==0{
return0
}
returnmath.MaxInt32
}
ifdp[i][k][c]!=-1{
returndp[i][k][c]
}
ans:=math.MaxInt32
ifhouses[i]!=0{
ifhouses[i]!=c{
ans=process1(houses,cost,n,i+1,k-1,houses[i],dp)
}else{
ans=process1(houses,cost,n,i+1,k,houses[i],dp)
}
}else{
forfill:=1;fill<=n;fill++{
varnextint
iffill==c{
next=process1(houses,cost,n,i+1,k,fill,dp)
}else{
next=process1(houses,cost,n,i+1,k-1,fill,dp)
}
ifnext!=math.MaxInt32{
ans=min(ans,cost[i][fill-1]+next)
}
}
}
dp[i][k][c]=ans
returnans
}
funcminCost2(houses[]int,cost[][]int,mint,nint,targetint)int{
dp:=make([][]int,target+1)
fork:=rangedp{
dp[k]=make([]int,n+1)
}
forc:=0;c<=n;c++{
dp[0][c]=0
}
fork:=1;k<=target;k++{
forc:=0;c<=n;c++{
dp[k][c]=math.MaxInt32
}
}
memo:=make([]int,n+1)
fori:=m-1;i>=0;i--{
ifhouses[i]!=0{
houseColor:=houses[i]
fork:=target;k>=0;k--{
memory:=dp[k][houseColor]
forc:=0;c<=n;c++{
ifhouseColor!=c{
ifk==0{
dp[k][c]=math.MaxInt32
}else{
dp[k][c]=dp[k-1][houseColor]
}
}else{
dp[k][c]=memory
}
}
}
}else{
fork:=target;k>=0;k--{
forc:=0;c<=n;c++{
memo[c]=dp[k][c]
}
forc:=0;c<=n;c++{
ans:=math.MaxInt32
forfill:=1;fill<=n;fill++{
varnextint
iffill==c{
next=memo[fill]
}else{
ifk==0{
next=math.MaxInt32
}else{
next=dp[k-1][fill]
}
}
ifnext!=math.MaxInt32{
ans=min(ans,cost[i][fill-1]+next)
}
}
dp[k][c]=ans
}
}
}
}
ifdp[target][0]==math.MaxInt32{
return-1
}
returndp[target][0]
}
funcminCost3(houses[]int,cost[][]int,mint,nint,targetint)int{
dp:=make([][]int,target+1)
fork:=rangedp{
dp[k]=make([]int,n+1)
}
forc:=0;c<=n;c++{
dp[0][c]=0
}
fork:=1;k<=target;k++{
forc:=0;c<=n;c++{
dp[k][c]=math.MaxInt32
}
}
memo:=make([]int,n+1)
minl:=make([]int,n+2)
minr:=make([]int,n+2)
minr[n+1]=math.MaxInt32
minl[n+1]=minr[n+1]
minr[0]=minl[n+1]
minl[0]=minr[0]
fori:=m-1;i>=0;i--{
ifhouses[i]!=0{
fork,memory:=target,0;k>=0;k--{
memory=dp[k][houses[i]]
forc:=0;c<=n;c++{
ifhouses[i]!=c{
ifk==0{
dp[k][c]=math.MaxInt32
}else{
dp[k][c]=dp[k-1][houses[i]]
}
}else{
dp[k][c]=memory
}
}
}
}else{
fork:=target;k>=0;k--{
forc:=0;c<=n;c++{
memo[c]=dp[k][c]
}
forfill:=1;fill<=n;fill++{
ifk==0||dp[k-1][fill]==math.MaxInt32{
minl[fill]=minl[fill-1]
}else{
minl[fill]=min(minl[fill-1],cost[i][fill-1]+dp[k-1][fill])
}
}
forfill:=n;fill>=1;fill--{
ifk==0||dp[k-1][fill]==math.MaxInt32{
minr[fill]=minr[fill+1]
}else{
minr[fill]=min(minr[fill+1],cost[i][fill-1]+dp[k-1][fill])
}
}
forc,ans:=0,0;c<=n;c++{
ifc==0||memo[c]==math.MaxInt32{
ans=math.MaxInt32
}else{
ans=cost[i][c-1]+memo[c]
}
ifc>0{
ans=min(ans,minl[c-1])
}
ifcans=min(ans,minr[c+1])
}
dp[k][c]=ans
}
}
}
}
ifdp[target][0]!=math.MaxInt32{
returndp[target][0]
}
return-1
}
funcmin(a,bint)int{
ifareturna
}
returnb
}
funcmain(){
houses:=[]int{0,0,0,0,0}
cost:=[][]int{{1,10},{10,1},{10,1},{1,10},{5,1}}
m:=5
n:=2
target:=3
fmt.Println(minCost1(houses,cost,m,n,target))
fmt.Println(minCost2(houses,cost,m,n,target))
fmt.Println(minCost3(houses,cost,m,n,target))
}



Python完整代码如下:

#-*-coding:utf-8-*-
importsys
defminCost1(houses,cost,m,n,target):
dp=[[[-1]*(n+1)for_inrange(target+1)]for_inrange(m)]
ans=process1(houses,cost,n,0,target,0,dp)
ifans==sys.maxsize:
return-1
returnans
defprocess1(houses,cost,n,i,k,c,dp):
ifk<0:
returnsys.maxsize
ifi==len(houses):
ifk==0:
return0
returnsys.maxsize
ifdp[i][k][c]!=-1:
returndp[i][k][c]
ans=sys.maxsize
ifhouses[i]!=0:
ifhouses[i]!=c:
ans=process1(houses,cost,n,i+1,k-1,houses[i],dp)
else:
ans=process1(houses,cost,n,i+1,k,houses[i],dp)
else:
forfillinrange(1,n+1):
iffill==c:
next=process1(houses,cost,n,i+1,k,fill,dp)
else:
next=process1(houses,cost,n,i+1,k-1,fill,dp)
ifnext!=sys.maxsize:
ans=min(ans,cost[i][fill-1]+next)
dp[i][k][c]=ans
returnans
defminCost2(houses,cost,m,n,target):
dp=[[0]*(n+1)for_inrange(target+1)]
forcinrange(n+1):
dp[0][c]=0
forkinrange(1,target+1):
forcinrange(n+1):
dp[k][c]=sys.maxsize
memo=[0]*(n+1)
foriinrange(m-1,-1,-1):
ifhouses[i]!=0:
houseColor=houses[i]
forkinrange(target,-1,-1):
memory=dp[k][houseColor]
forcinrange(n+1):
ifhouseColor!=c:
ifk==0:
dp[k][c]=sys.maxsize
else:
dp[k][c]=dp[k-1][houseColor]
else:
dp[k][c]=memory
else:
forkinrange(target,-1,-1):
forcinrange(n+1):
memo[c]=dp[k][c]
forcinrange(n+1):
ans=sys.maxsize
forfillinrange(1,n+1):
iffill==c:
next=memo[fill]
else:
ifk==0:
next=sys.maxsize
else:
next=dp[k-1][fill]
ifnext!=sys.maxsize:
ans=min(ans,cost[i][fill-1]+next)
dp[k][c]=ans
ifdp[target][0]==sys.maxsize:
return-1
returndp[target][0]
defminCost3(houses,cost,m,n,target):
dp=[[0]*(n+1)for_inrange(target+1)]
forcinrange(n+1):
dp[0][c]=0
forkinrange(1,target+1):
forcinrange(n+1):
dp[k][c]=sys.maxsize
memo=[0]*(n+1)
minl=[sys.maxsize]*(n+2)
minr=[sys.maxsize]*(n+2)
minl[n+1]=minr[n+1]=sys.maxsize
minl[0]=minr[0]=sys.maxsize
foriinrange(m-1,-1,-1):
ifhouses[i]!=0:
forkinrange(target,-1,-1):
memory=dp[k][houses[i]]
forcinrange(n+1):
ifhouses[i]!=c:
ifk==0:
dp[k][c]=sys.maxsize
else:
dp[k][c]=dp[k-1][houses[i]]
else:
dp[k][c]=memory
else:
forkinrange(target,-1,-1):
forcinrange(n+1):
memo[c]=dp[k][c]
forfillinrange(1,n+1):
ifk==0ordp[k-1][fill]==sys.maxsize:
minl[fill]=minl[fill-1]
else:
minl[fill]=min(minl[fill-1],cost[i][fill-1]+dp[k-1][fill])
forfillinrange(n,0,-1):
ifk==0ordp[k-1][fill]==sys.maxsize:
minr[fill]=minr[fill+1]
else:
minr[fill]=min(minr[fill+1],cost[i][fill-1]+dp[k-1][fill])
forcinrange(n+1):
ifc==0ormemo[c]==sys.maxsize:
ans=sys.maxsize
else:
ans=cost[i][c-1]+memo[c]
ifc>0:
ans=min(ans,minl[c-1])
ifcans=min(ans,minr[c+1])
dp[k][c]=ans
ifdp[target][0]!=sys.maxsize:
returndp[target][0]
return-1
defmin(a,b):
returnaifa
houses=[0,0,0,0,0]
cost=[[1,10],[10,1],[10,1],[1,10],[5,1]]
m=5
n=2
target=3
print(minCost1(houses,cost,m,n,target))
print(minCost2(houses,cost,m,n,target))
print(minCost3(houses,cost,m,n,target))



声明:个人原创,仅供参考

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
具俊晔情绪失控,罕见发脾气!韩网友:说的难道不是事实?

具俊晔情绪失控,罕见发脾气!韩网友:说的难道不是事实?

花花lo先森
2024-06-04 14:12:18
重磅!两大央企巨头成立又一新能源公司

重磅!两大央企巨头成立又一新能源公司

叮当当科技
2024-06-05 08:12:59
尺度太大?互动影游《夜蒲女子图鉴》Steam下架

尺度太大?互动影游《夜蒲女子图鉴》Steam下架

游民星空
2024-06-03 22:12:08
朱婷被冷藏?惠若琪炮轰教练短视

朱婷被冷藏?惠若琪炮轰教练短视

阿芒娱乐说
2024-06-05 07:56:44
湖北小县城,满城尽是“停车场”

湖北小县城,满城尽是“停车场”

英军眼
2024-06-04 08:10:55
嫦娥六号揭穿NASA局长谎言!采样后起飞环月,月壤将共享?已回应

嫦娥六号揭穿NASA局长谎言!采样后起飞环月,月壤将共享?已回应

环球科学猫
2024-06-04 11:19:09
内马尔:我认为没其他球员能在今年金球奖的竞争中赢维尼修斯

内马尔:我认为没其他球员能在今年金球奖的竞争中赢维尼修斯

直播吧
2024-06-04 09:00:03
别太离谱!谁家校服这么薄这么透?网友辣评:我们还真这样!

别太离谱!谁家校服这么薄这么透?网友辣评:我们还真这样!

白宸侃片
2024-06-02 06:38:23
难怪会雷厉风行地加大力度夜查电动车,真相终于浮出水面

难怪会雷厉风行地加大力度夜查电动车,真相终于浮出水面

莆农阿
2024-06-05 08:03:11
月球插下的中国国旗,让美国登月遭到质疑,美国国旗露出了马脚?

月球插下的中国国旗,让美国登月遭到质疑,美国国旗露出了马脚?

百态人间
2024-05-18 18:31:45
纪实:马未都:丢尽了中国人的脸,他还觉得自己是国民英雄!

纪实:马未都:丢尽了中国人的脸,他还觉得自己是国民英雄!

星辰故事屋
2024-06-03 19:09:34
60岁的夫妻,一周同房几次比较好?60岁绝经大姐一周一次,如何?

60岁的夫妻,一周同房几次比较好?60岁绝经大姐一周一次,如何?

39健康网
2024-05-19 23:20:03
形势有多严峻?暗示“苦日子”已经开始了

形势有多严峻?暗示“苦日子”已经开始了

山丘楼评
2024-06-03 11:30:33
大陆这招比军演更有效,台各界纷纷喊疼,就应该这样收拾“台独”

大陆这招比军演更有效,台各界纷纷喊疼,就应该这样收拾“台独”

青年的背包
2024-06-04 13:11:06
美国为什么敢扒掉俄罗斯的核底裤?

美国为什么敢扒掉俄罗斯的核底裤?

思想无疆
2024-05-31 11:45:11
换购:那不勒斯希望以奥斯梅恩的交易换取两名阿森纳球员

换购:那不勒斯希望以奥斯梅恩的交易换取两名阿森纳球员

刺头体育
2024-06-04 17:21:30
他是林彪的第一心腹,晚年选择“装聋作哑”,死后千人为其送行

他是林彪的第一心腹,晚年选择“装聋作哑”,死后千人为其送行

洞鉴五千年
2024-05-27 11:32:20
高考在即!福耀科技大学审批未过,清华原校长梅贻琦早已指出原因

高考在即!福耀科技大学审批未过,清华原校长梅贻琦早已指出原因

解说阿洎
2024-06-04 17:48:42
A股:大家提前做好心理准备,股市,很可能会重演历史?

A股:大家提前做好心理准备,股市,很可能会重演历史?

财经大拿
2024-06-05 02:10:02
坍塌事故向实习生追刑责,算不算“背锅”?

坍塌事故向实习生追刑责,算不算“背锅”?

天涯社区
2024-06-04 17:22:33
2024-06-05 09:02:44
moonfdd
moonfdd
福大大架构师每日一题
411文章数 7关注度
往期回顾 全部

科技要闻

马斯克把特斯拉5亿美元AI芯片提前调拨给X

头条要闻

大选结果揭晓 印媒:莫迪浪潮崩溃 印度发生重大转变

头条要闻

大选结果揭晓 印媒:莫迪浪潮崩溃 印度发生重大转变

体育要闻

从英国联赛到NBA,两个美国人相爱相杀

娱乐要闻

杨幂留言为热巴庆生,姐妹情深惹人羡

财经要闻

六年四换帅,茅台到底经历了什么?

汽车要闻

2.0T+云辇-P+天神之眼 方程豹豹8还配软包内装

态度原创

教育
旅游
本地
数码
军事航空

教育要闻

重磅2025年度QS世界大学排名!高考志愿哪些双一流进入全球百强?

旅游要闻

去年中国156人死于户外探险

本地新闻

我和我的家乡|踏浪营口,心动不止一夏!

数码要闻

专利显示苹果仍在考虑为AirPods充电盒配备屏幕 华强北继续遥遥领先

军事要闻

俄车臣特种部队已转至哈尔科夫 指挥官:进入决战阶段

无障碍浏览 进入关怀版