[AcWing 187] 导弹防御系统

image
image


点击查看代码
#include<iostream>

using namespace std;

const int N = 60;

int n, res;
int a[N], up[N], down[N];

void dfs(int u, int su, int sd)
{
	if (su + sd >= res)	return ;
	else if (u == n + 1) {
		res = min(res, su + sd);
		return ;
	}
	int k = 0;
	while (k < su && up[k] >= a[u])  k ++;
	if (k < su) {
		int t = up[k];
		up[k] = a[u];
		dfs(u + 1, su, sd);
		up[k] = t;
	}
	else {
		up[k] = a[u];
		dfs(u + 1, su + 1, sd);
	}
	k = 0;
	while (k < sd && down[k] <= a[u])  k ++;
	if (k < sd) {
		int t = down[k];
		down[k] = a[u];
		dfs(u + 1, su, sd);
		down[k] = t;
	}
	else {
		down[k] = a[u];
		dfs(u + 1, su, sd + 1);
	}
} 

int main()
{
	while (cin >> n, n) {
		for (int i = 1; i <= n; i ++)	cin >> a[i];
		res = n;
		dfs(1, 0, 0);
		cout << res << endl;
	}
	return 0;
} 

  1. DFS, 迭代加深, 剪枝
    对于每个点,枚举在上升子序列和下降子序列两种情况,通过 dfs 搜索最优解
posted @ 2022-06-17 22:48  wKingYu  阅读(30)  评论(0)    收藏  举报