1. 程式人生 > >POJ合唱隊形

POJ合唱隊形

總時間限制: 
1000ms
 
記憶體限制: 
65536kB
描述
N位同學站成一排,音樂老師要請其中的(N-K)位同學出列,使得剩下的K位同學不交換位置就能排成合唱隊形。
合唱隊形是指這樣的一種隊形:設K位同學從左到右依次編號為1, 2, …, K,他們的身高分別為T1, T2, …, TK,則他們的身高滿足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K)。
你的任務是,已知所有N位同學的身高,計算最少需要幾位同學出列,可以使得剩下的同學排成合唱隊形。
輸入
輸入的第一行是一個整數N(2 <= N <= 100),表示同學的總數。第一行有n個整數,用空格分隔,第i個整數Ti(130 <= Ti <= 230)是第i位同學的身高(釐米)。
輸出
輸出包括一行,這一行只包含一個整數,就是最少需要幾位同學出列。
樣例輸入
8
186 186 150 200 160 130 197 220
樣例輸出
4
來源
2005~2006醫學部計算概論期末考試
#include <iostream>
#include 
<math.h> #include <string.h> #include <algorithm> #include <vector> #include <queue> #define INF 0x3f3f3f3f using namespace std; int main() { int N, qu[105]; int left[105], right[105]; left[0] = right[0] = 1; scanf("%d", &N); for (int i = 1; i <= N; i++){ scanf(
"%d", &qu[i]); left[i] = right[i] = 1; } for (int i = 1; i <= N; i++){ for (int j = 1; j < i ; j++){ if (qu[j] < qu[i]) left[i] = max(left[i], left[j] + 1); } for (int k = N - i + 2; k <= N; k++){ if (qu[N - i + 1]>qu[k]) right[N - i + 1] = max(right[N - i + 1], right[k] + 1); } } int ans = 0; for (int i = 1; i <= N; i++){ ans = max(ans, left[i] + right[i] - 1); } printf("%d", N - ans); return 0; }