题解 | #合唱队形#
合唱队形
http://www.nowcoder.com/practice/0045cd3e39634a66ada63c2adeb49234
考虑分别以各个位置为中心折点,在每个位置求其:
- 之前的最长严格上升子序列长度(要求包括自己):实际就是题目DP14中dp数组
- 之后的最长严格下降子序列长度(要求包括自己):可通过两次数组反转得到
然后就是简单的加减法,得到以各个位置为中心折点时,最少要Out的人数,取最小
def maxIncSub(arr):
# @arr 传入数组
# @return 返回求最长严格上升子序列的长度的dp数组
n=len(arr)
dp=[1]*n
for i in range(1,n):
for j in range(i):
if arr[j]<arr[i]:
dp[i]=max(dp[i],dp[j]+1)
return dp
n=eval(input())
arr=list(map(int,input().split()))
dp1=maxIncSub(arr)
arr.reverse()
dp2=maxIncSub(arr)
dp2.reverse()
minOut=n-1
for i in range(0,n):
Out=(i+1)-dp1[i]+(n-i)-dp2[i]
minOut=min(minOut,Out)
print(minOut)