HJ24_合唱队_动态规划_打印最少剔除人数_输出任意一列最长队列身高
Posted Aneverforget
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HJ24_合唱队_动态规划_打印最少剔除人数_输出任意一列最长队列身高相关的知识,希望对你有一定的参考价值。
#计算方法为,计算出以每个元素为最高点的最长121队列,再比较队列长度 #实现步骤: #分别计算从左往右和从右往左的递增数列,并将两者相加,减去重复计算的中间数,则为最长数列长度 #抓住了中间数的index,通过计算方法求出最长队列的每个队员身高。 import bisect def mid_incre(l): arr=[l[0]] dp=[1 for i in range(a)] for i in range(1,a): if l[i]>arr[-1]: arr.append(l[i]) dp[i]=len(arr) else: pos=bisect.bisect_left(arr,l[i])#获取插入序列左侧index dp[i]=pos+1 arr[pos]=l[i]#这个置换不能少。 return dp #a = 8 #l = [186, 186, 140, 200, 150, 400, 197, 190] a=int(input().strip()) l = list(map(int,input().strip().split())) #记录递增序列长度 left_incre=mid_incre(l) right_incre=mid_incre(l[::-1])[::-1] n_arr=[left_incre[i]+right_incre[i]-1 for i in range(len(left_incre))] print(a-max(n_arr)) #打印其中一列身高队列 for i in n_arr: if i==max(n_arr): ind=n_arr.index(i) break pq=[] for i in range(ind): if l[i]<l[ind] and pq==[]: pq.append(l[i]) elif pq[-1]>l[i]: pos=bisect.bisect_left(pq,l[i]) pq[pos]=l[i] elif pq[-1]<l[i]: pq.append(l[i]) #print(pq+[l[ind]]) pq1=[] temp=range(a)#print(temp[:ind+1:-1]) for i in temp[:ind:-1]: if l[i]<l[ind] and pq1==[]: pq1.append(l[i]) elif pq1[-1]>l[i]: pos=bisect.bisect_left(pq1,l[i]) #print(pos) pq1[pos]=l[i] elif pq1[-1]<l[i]: pq1.append(l[i]) one_queue=pq+[l[ind]]+pq1[::-1] print(one_queue)
以上是关于HJ24_合唱队_动态规划_打印最少剔除人数_输出任意一列最长队列身高的主要内容,如果未能解决你的问题,请参考以下文章