1. 程式人生 > >1058 合唱隊形 2004年NOIP全國聯賽提高組

1058 合唱隊形 2004年NOIP全國聯賽提高組

memset 全部 string pro tor chorus input clu algorithm

題目描述 Description

N位同學站成一排,音樂老師要請其中的(N-K)位同學出列,使得剩下的K位同學排成合唱隊形。

合唱隊形是指這樣的一種隊形:設K位同學從左到右依次編號為1,2…,K,他們的身高分別為T1,T2,…,TK, 則他們的身高滿足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。

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

輸入描述 Input Description

輸入文件chorus.in的第一行是一個整數N(2<=N<=100),表示同學的總數。第一行有n個整數,用空格分隔,第i個整數Ti(130<=Ti<=230)是第i位同學的身高(厘米)。

輸出描述 Output Description

輸出文件chorus.out包括一行,這一行只包含一個整數,就是最少需要幾位同學出列。

樣例輸入 Sample Input

8
186 186 150 200 160 130 197 220

樣例輸出 Sample Output

4

數據範圍及提示 Data Size & Hint

對於50%的數據,保證有n<=20;
對於全部的數據,保證有n<=100。

分類標簽 Tags 點此展開

#include <iostream>
#include <string
> #include <cstdio> #include <vector> #include <algorithm> #include <deque> #include <map> #include <stack> #include <cstring> using namespace std; typedef long long LL; #define INF 0x3f3f3f3f #define MAXN 200 + 99 int a[MAXN]; int dp1[MAXN]; int dp2[MAXN];
int n; int main() { ios::sync_with_stdio(0); cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; for (int i = 0; i < n; i++) { dp1[i] = 1; for (int j = 0; j < i; j++) { if (a[i] > a[j]) dp1[i] = max(dp1[i], dp1[j] + 1); } } memset(dp2, 0, sizeof(dp2)); reverse(a, a + n); for (int i = 0; i < n; i++) { dp2[i] = 1; for (int j = 0; j < i; j++) { if (a[i] > a[j]) dp2[i] = max(dp2[i], dp2[j] + 1); } } int MAX= -1; for (int i = 0; i < n; i++) MAX = max(MAX, dp1[i] + dp2[n - 1 - i]); cout << (n - MAX + 1) << endl; }

1058 合唱隊形 2004年NOIP全國聯賽提高組