1. 程式人生 > >1916 Problem C 合唱隊形

1916 Problem C 合唱隊形

問題 C: 合唱隊形

時間限制: 1 Sec  記憶體限制: 32 MB
提交: 65  解決: 33
[提交][狀態][討論版][命題人:外部匯入]

題目描述

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位同學的身高(釐米)。

輸出

可能包括多組測試資料,對於每組資料,
輸出包括一行,這一行只包含一個整數,就是最少需要幾位同學出列。

樣例輸入

3
174 208 219 
6
145 206 193 171 187 167 
0

樣例輸出

0
1
#include<iostream>
#include<algorithm>
using namespace std;
//dp[i]為以i作中間數左側遞增的最大數量
//dp2[i]為以i作中間數右側遞減的最大數量
int main() {
	int N;
	while (cin >> N&&N) {
		int a[110], dp[110] = { 0 }, dp2[110] = { 0 };
		for (int i = 0; i < N; i++) {
			cin >> a[i];
		}
		for (int i = 0; i < N; i++) {
			for (int j = 0; j < i; j++) {
				if (a[i] > a[j])
					dp[i] = max(dp[i], dp[j] + 1);
			}
		}
		for (int i = N - 1; i >= 0; i--) {
			for (int j = N - 1; j > i; j--) {
				if (a[i] > a[j])
					dp2[i] = max(dp2[i], dp2[j] + 1);
			}
			dp[i] = dp[i] + dp2[i] + 1;
		}
		cout << N - *max_element(dp, dp + N) << endl;
	}
	return 0;
}