題目來源:NOIP2004提升組
時間限制:\(1000ms\) 內存限制:\(128mb\)java
\(N\) 位同窗站成一排,音樂老師要請其中的 \((N-K)\) 位同窗出列,使得剩下的 \(K\) 位同窗排成合唱隊形。
合唱隊形是指這樣的一種隊形:設 \(K\) 位同窗從左到右依次編號爲 \(1,2…,K\) ,他們的身高分別爲 \(T_1,T_2,…,T_K\) ,則他們的身高知足 \(T_1<…<T_i>T_i+1>…>T_K (1≤i≤K)\) 。
你的任務是,已知全部 \(N\) 位同窗的身高,計算最少須要幾位同窗出列,能夠使得剩下的同窗排成合唱隊形。shell
輸入的第一行是一個整數 \(N\) ,表示同窗的總數。
第二行有 \(N\) 個整數,用空格分隔,第 \(i\) 個整數 \(T_i\) 是第 \(i\) 位同窗的身高(釐米)。spa
輸出包括一行,這一行只包含一個整數,就是最少須要幾位同窗出列。code
\(2 ≤N ≤ 100\) ,
\(130 ≤ T_i ≤ 230\)內存
8 186 186 150 200 160 130 197 220
4
要使全部同窗的身高呈現出先遞增後遞減的格式,須要將中間比較 突出 的同窗請出列。
先設置一箇中間點,中間點將左右兩邊分開,只須要使左右兩邊分別剔除的同窗最少,再將左右兩邊相加便可。
因爲分紅了左右兩邊,因而只須要計算左邊的最長遞增子序列,右邊反過來的最長遞增子序列,而後把它們加起來就獲得了須要的同窗的數量。
而後用總數減去須要的同窗的數量就獲得了須要剔除的同窗的數量。input
import java.util.*; public class Main { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); int[] t = new int[n]; for (int i = 0; i < n; i++) { t[i] = input.nextInt(); } input.close(); int[] f = new int[n], g = new int[n]; for (int i = 0; i < n; i++) { f[i] = 1; for (int j = 0; j < i; j++) { if (t[j] < t[i]) { f[i] = Math.max(f[i], f[j] + 1); } } } for (int i = n - 1; i >= 0; i--) { g[i] = 1; for (int j = n - 1; j >= i; j--) { if (t[j] < t[i]) { g[i] = Math.max(g[i], g[j] + 1); } } } int ans = 0; for (int k = 0; k < n; k++) { ans = Math.max(ans, f[k] + g[k] - 1); } System.out.println(n - ans); } }