试图找到简单的动态编程问题的递归

时间:2019-10-28 10:03:05

标签: python algorithm dynamic-programming

我正在尝试解决这个问题:

  

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))

1 个答案:

答案 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]