我正在尝试解决这个问题:
Therasa是一名护士。她想给一些药片的病人 她的做法。所有的病人排成一行,每个人都有一个 根据他或她的健康评分。 Therasa想要 给每位患者至少1片。患者嫉妒他们的 直系邻居,所以如果两个病人挨着坐 评分较高的人必须获得更多的平板电脑。 Therasa想要 省钱,所以她想减少平板电脑的总数。
输入输入的第一行是整数N,即 Therasa诊所的病人。以下N行中的每行包含 整数表示每个患者的健康评分。
输出输出一行,其中包含最少数量的平板电脑 Therasa必须付出。
约束1 <= N <= 100000 1 <=健康评分<= 100000
有人可以给我一些关于dp复发的直觉吗?
我尝试了这个,但是在一些测试用例上却失败了
n = int(input())
h = []
for i in range(n):
x = int(input())
h.append(x)
dp = [0] * len(h)
dp[0] = 1
for i in range(1, len(h)):
if h[i] > h[i-1]:
dp[i] = dp[i-1] + 1
else:
dp[i] = 1
for i in range(len(h)-2, -1, -1):
if h[i]>=h[i+1] and dp[i]<=dp[i+1]:
dp[i] = dp[i+1]
print(sum(dp))
答案 0 :(得分:2)
最后一部分(在反向移动时),您会犯一个小错误:
Grp0 : AFFAIRES - N
ListeGroupes : AFFAIRES - N
LGroupes1 : AFFAIRES - N
=============================================
Grp0 : AFFAIRES - N
ListeGroupes : AFFAIRES - N
LGroupes1 : AFFAIRES - O
应为:
for i in range(len(h)-2, -1, -1):
if h[i]>=h[i+1] and dp[i]<=dp[i+1]:
dp[i] = dp[i+1]
这里的问题是患者i的医疗保健程度更高,但药片数量较少(或相同)。在第一种情况下,您的情况是正确的,但您没有解决问题。在第二种情况下,您要确保患者我有更多桌子。
从正确答案中得出的补充剂,我建议的另一项改进是替换这些补充剂:
for i in range(len(h)-2, -1, -1):
if h[i]>h[i+1] and dp[i]<=dp[i+1]:
dp[i] = dp[i+1] + 1
有了这些:
dp = [0] * len(h)
dp[0] = 1
for i in range(1, len(h)):
if h[i] > h[i-1]:
dp[i] = dp[i-1] + 1
else:
dp[i] = 1
因为我们知道每个患者至少要得到 1片。
更新:以下是您的第一个代码将失败的示例:
h = [10,10,1]
您的代码将计算dp = [1、1、1]