1916 Problem C 合唱隊形
阿新 • • 發佈:2018-12-04
問題 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; }