1. 程式人生 > >單調遞增子序列-合唱隊列

單調遞增子序列-合唱隊列

題目描述

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

輸出描述:

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

輸入

8
186 186 150 200 160 130 197 220

輸出

4

#include "iostream" 
#include "limits.h"
using namespace std;

//先求最長遞增子序列 
/*
8
186 186 150 200 160 130 197 220
*/

int main()
{
	int n = 0;
	while(cin>>n)
	{
		int a[101] = {0};
		int l[101] = {0};
		int m[101] = {0};
		for(int i = 0;i<n;i++)
		{
			cin>>a[i];
			l[i] = 1;
			m[i] = 1;
		}
		
		for(int i = 0;i<n;i++) 
		{
			cin>>a[i];
			int sum = INT_MIN;
			for(int j = 0;j<i;j++)
			{
				if(a[i]>a[j]&&sum<l[j])
				{
					sum = l[j];
					l[i] = l[j] + 1;
				}
			}
			
		}
		
		for(int i = n-1;i>=0;i--)
		{
			int sum = INT_MIN;
			for(int j = n-1;j>i;j--)
			{
				if(a[i] > a[j] && sum < m[j])
				{
					sum = m[j];
					m[i] = m[j] + 1;
				}
			}
		}
		
		int s = INT_MIN;
		for(int i = 0;i<n;i++)	
		{
			if(s<(l[i] + m[i] - 1) )
			{
				s = l[i] + m[i] - 1;
			}
		}
		cout<<n-s<<endl;
	}
	return 0;
}