https://vjudge.net/problem/2082745/origin
在學校裏,一個班由n名學生組成。 在上午晨跑之前,同學們在班主任面前排成一條直線。 班主任對同學們的對齊方式不滿意; 確實,同學們按照他們的學號順序排列:1,2,3,......,n,但他們沒有按高度對齊。 班主任要求一些同學們離開隊伍,作爲留在隊伍裏的同學,不改變他們的位置,形成一條新的隊伍,使每個學生可以看到隊伍的端點(左或右)。 如果沒有任何學生的身高大於等於他的身高,這個學生就會看到隊伍的端點。
編寫一個程序,知道每個學生的高度,確定必須脫離的學生的最小數量。
Input
第一行輸入學生的個數 n ;
第二行輸入n個數,表示學生的身高,每個數之間由空格字符分隔。該行的第k個數字表示第k(1 <= k <= n)個學生的身高
數據限制:
•2 <= n <= 1000
•身高是區間[50,250]的整型數字
Output
只有一行輸出,輸出必須脫離的學生的最小數量。
Sample Input
8 186 186 131 200 140 100 197 220
Sample Output
4
#include<iostream>
#include<cstring>
using namespace std;
int a[1005], n;
int get_left(int x)
{
int dp[1000], res = 1;
//dp[0]=1;
for(int i = 1; i <=x; i++)
{
dp[i] = 1;
for(int j = i-1; j >= 0; j--)
if(a[j] < a[i])
dp[i] = max(dp[i], dp[j] + 1);
res = max(res, dp[i]);
}
return res;
}
int get_right(int x)
{
int dp[1000] = {1}, res = 0;
for(int i = x+1; i < n; i++)
{
dp[i] = 1;
for(int j = i-1; j > x; j--)
if(a[j] > a[i])
dp[i] = max(dp[i], dp[j] + 1);
res = max(res, dp[i]);
}
// cout << "res "<<res << endl;
return res;
}
int main()
{
while(cin >> n)
{
int ans = 0;
for(int i = 0; i < n; i++)
scanf("%d", a+i);
for(int i = 0; i < n; i++)
{
ans = max(ans, get_left(i) + get_right(i));
// cout << get_left(i) << ' ' << get_right(i) << endl;
}
ans = n - ans;
if(ans < 0) ans = 0;
cout << ans;
}
return 0;
}
//5 1 5 9 5 10