合唱隊形(遞增再遞減的最長子序列)

2021-10-21 00:21:39 字數 711 閱讀 6602

題目描述

n位同學站成一排,**老師要請其中的(n-k)位同學出列,使得剩下的k位同學不交換位置就能排成合唱隊形。

合唱隊形是指這樣的一種隊形:設k位同學從左到右依次編號為1, 2, …, k,他們的身高分別為t1, t2, …, tk,

則他們的身高滿足t1 < t2 < … < ti , ti > ti+1 > … > tk (1 <= i <= k)。

你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。

問題分析:由題目可知,合唱隊的隊形的高度變化如下圖

問題是要求最長的子串行,使得在這個子串行的同學能排成符合合唱隊的最長隊形(由低到高到低)

我們以前學過用dp求最長遞增子串行,同理也可以求最長遞減子串行。

這個求「最長遞增再遞減的子串行」問題可以分解成:求最長遞增子串行、最長遞減子串行兩個問題

只要我們找到某個特定的同學,以這個同學為中心,他左邊是最長遞增子串行,右邊是最長遞減子串行,那麼加上這個同學,這個合唱隊列就是最長的!

用 up[ i ] 記錄以同學 i 為結尾的最長遞增子串行長度(求最長遞增子串行)

用 down[ i ] 記錄以同學 i 為開頭的最長遞增子串行長度(求最長遞減子串行)

那麼 max 就是最長佇列的長度

最長遞增子串行 合唱隊形 山峰數列

1.最長單調遞增子串行 從頭部到尾部是嚴格遞增的 單調遞增的輔助陣列sort,k表示陣列sort目前的長度,演算法完成後k的值即為lis的長度。初始化 sort 0 a 0 k 1 從前到後掃瞄陣列a,比較當前的數a i 和sort k 1 如果a i sort k 1 a i 大於sort的最後乙...

合唱隊形 動態規劃 最長遞增子串行

n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學不交換位置就能排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 t2 ti ti ti 1 tk 1 i k 你的任務是,已知所有n位同學的...

合唱隊形 題解(變形的最長遞增子串行)

注意 6 之前的 求最長遞增子列長度 問題裡的dp i 的值是1到i序列裡最長遞增子列的長度,這個最長遞增子列並不一定是以i為尾。7而本題的最長子列問題,a i 是以i點為尾的最長遞增子列 8演算法思路 分別從前往後和從後往前尋找以i點為尾的最長子列,尋找兩個子列和的最大值 9 intmain 16...