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_合唱队_动态规划_打印最少剔除人数_输出任意一列最长队列身高的主要内容,如果未能解决你的问题,请参考以下文章

动态规划|删除最少的元素-最长下降子序列

[bzoj3717][PA2014]Pakowanie_动态规划_状压dp

华为机试HJ24:合唱队

HJ66 配置文件恢复_字典_字符串

牛客 HJ24 合唱队

动态规划-换钱最少货币数