P1091 合唱队形 TJ

题目链接

思路

正难则反。
求出保留的,即最长上升子序列,从头和从尾各求一遍,最后枚举出最大的保留的位数,
然后用 \(n\) 减去保留位数加 \(1\) 即可。

代码

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAXN = 101;
int n ,a[MAXN] ,ans = 0;
int dp[MAXN] ,dp_[MAXN];
int main () {
	scanf ("%d",&n);
	for (int q = 1;q <= n;++ q) {
		dp[q] = dp_[q] = 1;
		scanf ("%d",&a[q]);
	}
	for (int q = 1;q <= n;++ q) {
		for (int w = q - 1;w >= 1;-- w) {
			if (w < dp[q]) break;
			if (a[q] > a[w]) {
				dp[q] = max (dp[q] ,dp[w] + 1);
			}
		}
	}
	for (int q = n;q >= 1;-- q) {
		for (int w = q + 1;w <= n;++ w) {
			if (n - w + 1 < dp_[q]) break;
			if (a[q] > a[w]) {
				dp_[q] = max (dp_[q] ,dp_[w] + 1);
			}
		}
	}
	for (int q = 1;q <= n;++ q)
		ans = max (ans ,dp[q] + dp_[q]);
	printf ("%d\n",n - ans + 1);
	return 0;
}

posted @ 2020-10-18 12:02  tuscjaf  阅读(65)  评论(0编辑  收藏  举报