蓝桥杯备赛 [day11]3月26日|python|作物杂交——>查找DFS和amp;动态规划DP
目录
1.题目描述
作物杂交是作物栽培中重要的一步。已知有 N 种作物 (编号1 至 N),第 i 种作物从播种到成熟的时间为 Ti 。作物之间两两可以进行杂交,杂交时间取两种中时间较长的一方。如作物 A 种植时间为 5 天,作物 B 种植时间为 7 天,则 AB 杂交花费的时间为 7 天。作物杂交会产生固定的作物,新产生的作物仍然属于 N 种作物中的一种。
初始时,拥有其中 M 种作物的种子 (数量无限,可以支持多次杂交)。同时可以进行多个杂交过程。求问对于给定的目标种子,最少需要多少天能够得到。
如存在 4 种作物 ABCD,各自的成熟时间为 A: 5 天、B: 7 天、C: 3 天、D: 8 天。初始拥有 AB 两种作物的种子,目标种子为 D,已知杂交情况为 A × B → C,A × C → D。则最短的杂交过程为:
第 1 天到第 7 天 (作物 B 的时间),A × B → C。
第 8 天到第(7 5) 12 天 (作物 A 的时间),A × C → D。
花费 12 天得到作物 D 的种子。
2.输入描述
输入的第 1 行包含 4 个整数 N,M,K,T, N 表示作物种类总数 (编号 1 至 N),M 表示初始拥有的作物种子类型数量,K 表示可以杂交的方案数,T 表示目标种子的编号。
第 2 行包含 N 个整数,其中第 i 个整数表示第 i 种作物的种植时间 Ti (1≤Ti≤100)。
第 3 行包含 M 个整数,分别表示已拥有的种子类型 Kj (1≤Kj≤M),Kj 两两不同。
第 4 至 K 3 行,每行包含 3 个整数 A,B,C,表示第 A 类作物和第 B 类作物杂交可以获得第 C 类作物的种子。
其中,1≤N≤2000, 2≤M≤N, 1≤K≤10^5, 1≤T≤N, 保证目标种子一定可以通过杂交得到。
3.输出描述
输出一个整数,表示得到目标种子的最短杂交时间。
4.输入输出样例
4.1示例
4.1.1输入
-
第一行
-
6#作物种类总数
-
2#初始拥有的作物种子类型数量
-
4#可以杂交的方案数
-
6#目标种子的编号
-
-
第二行
-
5 3 4 6 4 9
-
第三行 已经拥有的种子类型
-
1 2
-
-
第四行 及以后
-
#1*2——>3 1*3——>4 2*3——>5 4*5——>6
-
1 2 3
-
1 3 4
-
2 3 5
-
4 5 6
4.1.2输出
16
4.2样例说明
第 1 天至第 5 天,将编号 1 与编号 2 的作物杂交,得到编号 3 的作物种子。
第 6 天至第 10 天,将编号 1 与编号 3 的作物杂交,得到编号 4 的作物种子。
第 6 天至第 9 天,将编号 2 与编号 3 的作物杂交,得到编号 5 的作物种子。
第 11 天至第 16 天,将编号 4 与编号 5 的作物杂交,得到编号 6 的作物种子。
总共花费 16 天。
5.程序设计
5.1解题思路
首先注意输入要求,第一行要包括四个数据,我们可以用map()
函数来实现input()
批量输入;
第二行,第三行的输入要为以后找最短天数提供数据,我们将其用列表的方式存储,便于后续使用;
接下来定义搜索函数dfs(),其中的参数T便是我们要求的目标作物
,当目标作物在已知的have中时,此时需要的时间就是0;
当其不在其中时,我们就在杂交方式ways(第四行及以后)中找到目标作物T,此时的ways中的元素中的小列表中的第三个元素便是我们的T,顺势我们将此小列表中得到T的那两个元素也在times中找到,看看他们所需要的时间,取他们其中的最大值tmp = max(times[i[0]-1], times[i[1]]-1);
紧接着采用递归的方式看看其余的这两个元素是否在已知的have中存在,若存在则时间是0,不存在则时间采用同种方式继续求得,此时的time便为min_t =max(dfs(i[0]), dfs(i[1])) tmp;
如果在have或者ways中没有我们所要的目标元素,那需要的时间就还是无限的,因此在开始时我们要把时间time定义为无限大,当只有在have或者ways中找到我们要得到的元素时,我们在能进一步得到一个具体的时间min_t ,此时让time = min_t,最后函数结束return 我们的time。
5.2程序代码
-
import math
-
#作物杂交-dfs
-
n,m,k,t=map(int,input().split())#n:种子编号-6类 m:初始种子数量-2个 k:杂交方案-4种 t:目标种子编号-6号
-
T=list(map(int,input().split()))#种植时间 T=[5,3,4,6,4,9]
-
K=list(map(int,input().split()))#已拥有的种子类型 M=[1,2]
-
-
mix=[[] for i in range(n 1)]#杂交列表初始化为空
-
for i in range(k):#输入4种杂交方案
-
a,b,c=map(int,input().split())#杂交方案 1 2→3 #1 3→4 #2 3→5 #4 5→6
-
max_time=max(T[a-1],T[b-1])#杂交最长时间 5 5 4 6
-
ls=[a,b,max_time]#ls=[种子a,种子b,杂交最长时间] [1,2,5] [1,3,5] [2,3,4] [4,5,6]
-
mix[c].append(ls)#mix=[[], [], [], [[1, 2, 5]], [[1, 3, 5]], [[2, 3, 4]], [[4, 5, 6]]]
-
#[[[],[],[]]]这种格式是因为一种作物可能存在多种杂交方案
-
#mix[i]:杂交方案 i:目标作物
-
-
min_time=[float("inf") for i in range(n 1)]#作物培养时间初始化为无穷大
-
for i in K: #初始化已有种子的培养时间为0
-
min_time[i]=0
-
#min_time=[0,0,0,inf,inf,inf···]
-
-
def dfs(i):#获取目标作物所需时间
-
if min_time[i]!=float("inf"):#计算过的作物直接返回
-
return min_time[i]
-
for j in range(len(mix[i])):#遍历一种作物的所有杂交方案
-
min_time[i]=min(min_time[i],max(dfs(mix[i][j][0]),dfs(mix[i][j][1])) mix[i][j][2])
-
#min_time[6]=min(inf,max(dfs(4),dfs(5)) 6h)=16h
-
#min_time[5]=min(inf,max(dfs(2),dfs(3)) 4h)=9h
-
#min_time[4]=min(inf,max(dfs(1),dfs(3)) 5h)=10h
-
#min_time[3]=min(inf,max(dfs(1),dfs(2)) 5h)=5h
-
#dfs(1)=0 #dfs(2)=0
-
return min_time[i]
-
-
print(dfs(t))#dfs(6)
-
import math
-
#作物杂交
-
n,m,k,t=map(int,input().split())
-
T=list(map(int,input().split()))
-
K=list(map(int,input().split()))
-
mix=[[] for i in range(n 1)]
-
for i in range(k):
-
a,b,c=map(int,input().split())
-
max_time=max(T[a-1],T[b-1])
-
ls=[a,b,max_time]
-
mix[c].append(ls)
-
dp=[float("inf") for i in range(n 1)]
-
for i in K:
-
dp[i]=0
-
def dfs(i):
-
if dp[i]!=float("inf"):
-
return dp[i]
-
for j in range(len(mix[i])):
-
dp[i]=min(dp[i],max(dfs(mix[i][j][0]),dfs(mix[i][j][1])) mix[i][j][2])
-
return dp[i]
-
print(dfs(t))
-
import os
-
import sys
-
-
# 请在此输入您的代码
-
-
#作物杂交
-
n,m,k,t=map(int,input().split())
-
T=list(map(int,input().split()))
-
K=list(map(int,input().split()))
-
mix=[[] for i in range(n 1)]
-
for i in range(k):
-
a,b,c=map(int,input().split())
-
max_time=max(T[a-1],T[b-1])
-
ls=[a,b,max_time]
-
mix[c].append(ls)
-
dp=[float("inf") for i in range(n 1)]
-
for i in K:
-
dp[i]=0
-
def dfs(i):
-
if dp[i]!=float("inf"):
-
return dp[i]
-
for j in range(len(mix[i])):
-
dp[i]=min(dp[i],max(dfs(mix[i][j][0]),dfs(mix[i][j][1])) mix[i][j][2])
-
return dp[i]
-
print(dfs(t))
报错
import math
N, M, K, T = map(int, input().split()) #四个整数
times = list(map(int, input().split())) #作物的种植时间
have = list(map(int, input().split())) #已经拥有的种子类型
ways = [] #杂交方式
for i in range(K):
ways.append(list(map(int, input().split())))
# 定义dfs函数搜索情况,参数T是目标种子
def dfs(T):
# 出口
if T in have:
return 0
# 寻找目标种子
time = math.inf
for i in ways:
if i[2] == T:
tmp = max(times[i[0]-1], times[i[1]]-1)
min_t = max(dfs(i[0]), dfs(i[1])) tmp
time = min_t
return time
print(dfs(T))
6.总结
用Mix[i]数组存储生成i的所有方案,方案由种子1和种子2及种植时间构成,Mix形成了三层列表;初始化未获得的种子时间min_time[i]为float('inf') 创建一个函数,返回获得目标种子的最短时间min_time[i] ;在调用函数的过程中,如果min_time[i]不等于无穷,说明获得i种子的时间已获得最优解,直接返回。否则DFS,遍历种子i的所有方案,不断更新最短时间(与上一轮进行比较) 而本轮的最短时间由三个要素决定:min_time[i]=max(获取原材料1的最短时间,获取原材料2的最短时间) max(原材料1的种植时间,原材料2的种植时间) 。
点赞 收藏 支持一下吧~
于 2023-03-27 21:35:32 首次发布
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgfcihh
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01