题解 | #买卖股票的最好时机(四)#

买卖股票的最好时机(四)

http://www.nowcoder.com/practice/ba3c096c19e04afbbbd59250e909ac68


# 借鉴买卖股票三的答案  把 5 换成 2k + 1 + 1


import sys

inputs = []
for line in sys.stdin:
    a = line.split()
    inputs.append(a)
    
n = int(inputs[0][0])
k = int(inputs[0][1])
P = [int(x) for x in inputs[1]]

if k > n / 2:
    # 则相当于买卖股票 (二), 此处贴 (二) 里的代码
    dp = 0
    for i in range(1, n):
        if P[i] > P[i - 1]:
            dp += P[i] - P[i - 1]
    print(dp)
else:
    dp = [[0] * (2 * k + 1 + 1) for _ in range(n + 1)]

    # 初始条件
    dp[0][1] = 0
    for j in range(2, 2 * k + 2):
        dp[0][j] = -float('inf')

    for i in range(1, n + 1):
        # 1, 3, 5
        for j in range(1, 2 * k + 2, 2):
            # dp[i][j] = max{dp[i-1][j], dp[i-1][j-1] + (P[N-1] - P[N-2])}
            dp[i][j] = dp[i-1][j]
            if j > 1 and i >= 2 and dp[i-1][j-1] != -float('inf'):
                dp[i][j] = max(dp[i][j], dp[i-1][j-1] + (P[i-1] - P[i-2]))

        # 2, 4
        for j in range(2, 2 * k + 1, 2):
            # dp[i][j] = max{dp[i-1][j] + (P[N-1] - P[N-2]), dp[i-1][j-1], dp[i-1][j-2] + (P[N-1] - P[N-2])}
            dp[i][j] = dp[i-1][j-1]
            if i > 1 and dp[i-1][j] != -float('inf'):
                dp[i][j] = max(dp[i][j], dp[i-1][j] + (P[i-1] - P[i-2]))

            if j > 2 and i >= 2 and dp[i-1][j-2] != -float('inf'):
                dp[i][j] = max(dp[i][j], dp[i-1][j-2] + (P[i-1] - P[i-2]))

    out = 0
    for j in range(1, 2 * k + 2, 2):
        out = max(out, dp[n][j])

    print(out)
    
全部评论

相关推荐

不愿透露姓名的神秘牛友
今天 11:27
点赞 评论 收藏
分享
06-20 21:22
已编辑
门头沟学院 Java
纯真的河老师在喝茶:答应了就跑啊,实习随便跑啊,别被pua了,md就是找个廉价劳动力,还平稳过度正式工,到时候跟你说没转正
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务