题解 | #合唱队#

合唱队

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

import sys
#解决问题的过程为:寻找每个位置左边的最长递增序列和右边的最长递减序列,遍历取最长,即为最长的"合唱队"
def uplongn(lst): #寻找序列中每个位置左边能构成递增序列的最大长度dp(包括自身)
    dp = []   
    for i in range(len(lst)):
        dp.append(1)    ##初始化最长序列长度为1
        for j in range(i):  
		#对每个位置i,从0到i位置遍历:如果i位置高于j位置,则dp[i]应该比dp[j]大1同时也应该比dp[j]大
		#同时注意到,对于任意的i>j,如果i位置高于j位置,都应该有dp[i]比dp[j]+1大,所以不仅需要i遍历,j遍历同样需要。如果单纯计算各位置左侧小于自身的点个数,一旦左侧有极小值时则会计算错误序列长度。
            if lst[i] > lst[j]:
                dp[i] = max(dp[i],dp[j] + 1)
    return dp
num = int(input())  ##样本数
lst = list(map(int,input().split(" "))) ##样本,用" "分割
res = []  #初始化结果
dp1 = uplongn(lst) #从左开始向右,截至各点的最长序列长度
dp2 = uplongn(lst[::-1])[::-1]  ##从右开始向左,截至各点最长序列长度
for i in range(num):
    res.append(dp1[i] + dp2[i] -1)  #计算"合唱队"序列长度,由于各点重复计算了1次,所以需要去掉。
print(num-max(res))

全部评论

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务