joj 2529 Chorus 动态规划 最长上升子序列和最长下降子序列

题目链接:http://acm.jlu.edu.cn/joj/showproblem.php?pid=2529

题目大意:给出一个队列的总人数和各自的身高,问最少剔除多少人才能让这个序列从左到 i 为一直增高, 从i 到 有一直变矮,相邻两个不能相等。

Sample Input

8
186 186 150 200 160 130 197 220

Sample Output

4

AC程序:

#include "iostream"
#include "cstring"
using namespace std;
#define size 110

int main(){
	//freopen("in.txt", "r", stdin);
	int n, a[size], up[size], down[size], i, j, max;
	while(cin>>n){
		memset(up, 0, sizeof(up));
		memset(down, 0, sizeof(down));
		for(i = 1; i <= n; i++)
			cin>>a[i];
		//up[i]为1到i可以保留的最大人数
		up[1] = 1;
		for(i = 2; i <= n; i++){
			up[i] = 1;
			for(j = 1; j < i; j++){
				if(a[j] < a[i] && up[j] + 1 > up[i]){
					up[i] = up[j] + 1;
				}
			}
		}
		//down[i]为i到n可以保留的最大人数
		down[n] = 1;
		for(i = n - 1; i >= 1; i--){
			down[i] = 1;
			for(j = n; j > i; j--){
				if(a[j] < a[i] && down[j] + 1 > down[i]){
					down[i] = down[j] + 1;
				}
			}
		}
		max = 0;
		//求可以保留的最大人数
		for(i = 1; i <= n; i++){
			if(up[i] + down[i] > max)				
				max = up[i] + down[i];
		}		
		max--;	//对于i算了两次,所以减1
		cout<<n - max<<endl;
	}
	return 0;
}


 

你可能感兴趣的:(动态规划,最长上升子序列,最长下降子序列)