NBUT 1746 可怕的班主任(思維)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章