题解 | #合唱队#
合唱队
https://www.nowcoder.com/practice/6d9d69e3898f45169a441632b325c7b4
##有参考大佬写的代码 N = int(input()) # 同学的总数 ls = list(map(int,input().split())) # N位同学的身高 ls1 = [1] * len(ls) # 存储长度 ##因为至少有一个自己本身,所以初始值设置为1 ls2 = [1] * len(ls) # 假设正好第i位同学左右两边可以组成合唱队,那么说明i左边的都比他矮,i右边的也比他矮 # 先算左边的长度 for i in range(len(ls)): for j in range(i): if ls[i] > ls[j] and ls1[i] < ls1[j] + 1: ls1[i] = ls1[j] + 1 #print(ls1) # 再计算右边的最大长度(注意右边需要倒着来) for i in range(len(ls)-1,-1,-1): # 注意这个结束位置是-1,因为本来要到取到位置0,但是range()函数不包含结束位置,所以要写-1 for k in range(len(ls)-1,i-1,-1): if ls[i] > ls[k] and ls2[i] < ls2[k] + 1: ls2[i] = ls2[k] + 1 #print(ls2) ###print(N-max(ls1)-max(ls2)+1) # 注意,不能写成这样的 p = 0 for i in range(N): # 186 186 150 200 160 130 197 200 if ls1[i] + ls2[i]-1 > p: # 注意是左右两个列表的对应位置相减 p = ls1[i] + ls2[i]-1 print(N-p)