动态规划练习2 [合唱队形]
生活随笔
收集整理的這篇文章主要介紹了
动态规划练习2 [合唱队形]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
N
位同學站成一排,音樂老師要請其中的
(N-K)
位同學出列,使得剩下的
K
位同學排成合唱隊形。
合唱隊形是指這樣的一種隊形:設 K 位同學從左到右依次編號為 1 , 2 …, K ,他們的身高分別為 T1 ,
T2 ,…, TK , 則他們的身高滿足 T1<...<Ti>Ti+1> … >TK(1<=i<=K) 。
你的任務是,已知所有 N 位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱
隊形。
【輸入文件】
輸入文件 chorus.in 的第一行是一個整數 N(2<=N<=100) ,表示同學的總數。第二行有 n 個整數,
用空格分隔,第 i 個整數 Ti(130<=Ti<=230) 是第 i 位同學的身高 ( 厘米 ) 。
【輸出文件】
輸出文件 chorus.out 包括一行,這一行只包含一個整數,就是最少需要幾位同學出列。
【樣例輸入】
8
186 186 150 200 160 130 197 220
【樣例輸出】
4
【數據規模】
對于 50 %的數據,保證有 n<=20 ;
合唱隊形是指這樣的一種隊形:設 K 位同學從左到右依次編號為 1 , 2 …, K ,他們的身高分別為 T1 ,
T2 ,…, TK , 則他們的身高滿足 T1<...<Ti>Ti+1> … >TK(1<=i<=K) 。
你的任務是,已知所有 N 位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱
隊形。
【輸入文件】
輸入文件 chorus.in 的第一行是一個整數 N(2<=N<=100) ,表示同學的總數。第二行有 n 個整數,
用空格分隔,第 i 個整數 Ti(130<=Ti<=230) 是第 i 位同學的身高 ( 厘米 ) 。
【輸出文件】
輸出文件 chorus.out 包括一行,這一行只包含一個整數,就是最少需要幾位同學出列。
【樣例輸入】
8
186 186 150 200 160 130 197 220
【樣例輸出】
4
【數據規模】
對于 50 %的數據,保證有 n<=20 ;
對于全部的數據,保證有 n<=100。
思路:
枚舉最中間的那個同學,然后對其左邊的同學身高序列求最長上升子序列,對其右邊的身高序列求最長下降子序列,則兩部分的長度之和加上1就是以該同學為中心的合唱隊形的長度。事實上,并非需要每次都求上升序列和下降序列長度,只需要在一開始從左邊求一次最長上升序列用rise[i]表示序列[1...i],并且以a[i]為結尾的最長上升序列長度。從右邊開始求一次最長下降序列長度down[i]表示[i...n]中以a[i]為開頭的最長下降序列長度。這樣的話,隊形長度就是max{rise[i]+down[i]-1}
總結
以上是生活随笔為你收集整理的动态规划练习2 [合唱队形]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称英伟达、AMD 将制造基于 ARM
- 下一篇: 动态规划训练5 [回文词]