题目
作物杂交是作物栽培中重要的一步。已知有 N 种作物 (编号 1 至 N ),第 i 种作物从播种到成熟的时间为 Ti。作物之间两两可以进行杂交,杂交时间取两种中时间较长的一方。如作物 A 种植时间为 5 天,作物 B 种植时间为 7 天,则 AB 杂交花费的时间为 7 天。作物杂交会产生固定的作物,新产生的作物仍然属于 N 种作物中的一种。
初始时,拥有其中 M 种作物的种子 (数量无限,可以支持多次杂交)。同时可以进行多个杂交过程。求问对于给定的目标种子,最少需要多少天能够得到。
如存在 4 种作物 ABCD,各自的成熟时间为 5 天、7 天、3 天、8 天。初始拥有 AB 两种作物的种子,目标种子为 D,已知杂交情况为 A × B → C,A × C → D。则最短的杂交过程为:
第 1 天到第 7 天 (作物 B 的时间),A × B → C。
第 8 天到第 12 天 (作物 A 的时间),A × C → D。
花费 12 天得到作物 D 的种子。
思路
看题目给出的示例,一脸懵,觉得这个还要双线程进行杂交,好复杂。就去看了别人的解析,发现主要思想就是利用动态规划的思想,从目标作物进行递归。
代码
import os
import sys
N, M, K, T = map(int, input().split())
T2 = list(map(int, input().split())) # 作物生长时间
have = list(map(int, input().split())) # 已有种子
st = [False] * (N+1)
cross = [[] for _ in range(N+1)] # 存储杂交规则 a+b->c cross[c] 存储(a, b)
g = [10000000] * (N+1) # 得到作物所需时间
for i in have: # 初始化已有种子的状态
st[i] = True
g[i] = 0
for _ in range(K): # 记录每条杂交规则
a, b, c = map(int, input().split())
cross[c].append((a, b))
def dfs(u): # 动态规划思想
if st[u]:
return g[u]
for a, b in cross[u]: # 杂交规则一遍遍递归
g[u] = min(g[u], max(dfs(a), dfs(b)) + max(T2[a-1], T2[b-1]))
st[u] = True
return g[u]
dfs(T)
print(g[T])
问题
小蓝有一个裁纸刀,每次可以将一张纸沿一条直线裁成两半。
小蓝用一张纸打印出两行三列共 6 个二维码,至少使用九次裁出来,下图给出了一种裁法。
思路
数学题,提炼出规律。n行m列 需要裁: (n-1) + n*(m-1) + 4
代码
import os
import sys
# 请在此输入您的代码
print(19+20*21+4)