oj1054: 合唱队形

题目要求
Description
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。

合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK,  则他们的身高满足T1<...Ti+1>…>TK(1<=i<=K)。

你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

Input
输入的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
Output
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
Sample Input
Raw
8
186 186 150 200 160 130 197 220
Sample Output
Raw
4
Source
NOIP2004
题目要求从中间寻找一个数字,在它之前的最长递增子序列和在它之后的最长最长的递减子序列,最后两段相加减中间重复的1。
从1开始到n再进行一次遍历,寻找最小值min。.

#include
#include
#include
#include
#include
#include
#include
#include//~~头文件平台要求~~ 
using namespace std;
int main(void)
{
	int n;
	int a[110],dp1[110],dp2[110];
	while (cin >> n)
	{
		for (int i = 1; i <= n; i++)
			cin >> a[i];
		for (int i = 1; i <= n; i++)
		{
			int tmp = 1;
			for (int j = 1; j < i; j++)
				if (a[j] < a[i])
					tmp = max(tmp, dp1[j] + 1);
			dp1[i] = tmp;
		}
		for (int i = n; i >= 1; i--)
		{
			int tmp = 1;
			for (int j = n; j > i; j--)
				if (a[i] > a[j])
					tmp = max(tmp, dp2[j] + 1);
			dp2[i] = tmp;
		}
		int min = 0;
		for (int i = 1; i <= n ; i++)
			min = max(dp1[i] + dp2[i] - 1, min);
		cout << n - min << endl;
	}
	return 0;
}

你可能感兴趣的:(oj)