TYVJ 1067 合唱队形 解题报告

  是某某年的NOIP原题吧,题目的思路如下:

  f[i]是1~i的最长上升序列,g[i]代表从后到前的最长上升序列,然后枚举每个i,求n-max{f[i] + g[i] - 1},就是答案。

================================华丽的分割线 ================================

#include <stdio.h>
#include <stdlib.h>
int f1[100], f2[100], num[100];
int ans;

int main(int argc, char **argv)
{
	int n;
	int i, j;
	scanf("%d", &n);
	for(i = 0; i < n; i++){
		scanf("%d", &num[i]);
	}
	for(i = 0; i < n; i++){
		f1[i] = 1;
		for(j = 0; j < i; j++){
			if(num[j] < num[i] && f1[i] < f1[j] + 1){
				f1[i] = f1[j] + 1;
			}
		}
	}
	for(i = n - 1; i >= 0; i--){
		f2[i] = 1;
		for(j = n - 1; j > i; j--){
			if(num[j] < num[i] && f2[i] < f2[j] + 1){
				f2[i] = f2[j] + 1;
			}
		}
	}
	for(i = 0; i < n; i++){
		if(ans < f1[i] + f2[i] - 1){
			ans = f1[i] + f2[i] - 1;
		}
	}
	//题目要求输出的是需要出列的人
	printf("%d\n", n - ans);
	return 0;
}

posted @ 2011-06-23 22:33  zqynux  阅读(446)  评论(0编辑  收藏  举报