题解 | #合唱队#

合唱队

http://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4

#动态规划(Dynamic Programming)
# import sys
def left_max(l):
    #计算每个人左边出现的最多人数
    N = len(l)
    dp = [1] * N #若左边没有比自己小的数,则为自己本身,所以初始值为1
    for i in range(N):  #从左往右遍历
        for j in range(i):
            if l[j] < l[i] and dp[i] < dp[j] + 1:
                dp[i] = dp[j] + 1
#             if l[j] < l[i]:
#                 dp[i] = max(dp[i],dp[j] + 1)
    return dp

while True:
    try:
        N = int(input())
        nums = list(map(int, input().split()))

        dp1 = left_max(nums)
        dp2 = left_max(nums[::-1])[::-1]
#         print(dp1)#[1, 1, 1, 2, 2, 1, 3, 4]
#         print(dp2)#[3, 3, 2, 3, 2, 1, 1, 1]
        dp3 = [dp1[i] + dp2[i] for i in range(N)]
        #加起来队列的最大值,就是能够站的最大人数
        print(N - max(dp3) + 1)
    except:
#         print(sys.exc_info())
        break














全部评论

相关推荐

10-17 12:16
同济大学 Java
7182oat:快快放弃了然后发给我,然后让我也泡他七天最后再拒掉,狠狠羞辱他一把😋
点赞 评论 收藏
分享
冲芭芭拉鸭:你这图还挺新,偷了。
投递美团等公司10个岗位
点赞 评论 收藏
分享
评论
4
收藏
分享
牛客网
牛客企业服务