#include<bits/stdc++.h>
using namespace std;
const int N = 55;
int a[N],up[N],down[N];
int n;
int cnt;
void dfs(int u,int uu,int dd)
{
//剪枝,并且只有比当前的cnt小,才能更新,换成n直接tle。。。
if(uu+dd>=cnt)return;
//遍历完所有点后,就能求出最小的上升子序列和下降子序列之和
if(u==n)
{
//由于满足上述条件,所以新值一定比旧值小,所以可以直接等于,不用min
cnt=uu+dd;
return;
}
//情况1,加入到上升子序列中
int i=0;
while(i<uu&&up[i]>=a[u])i++;
int t=up[i];
up[i]=a[u];
if(i<uu)dfs(u+1,uu,dd);
else dfs(u+1,uu+1,dd);
//恢复现场
up[i]=t;
//情况2,加入到下降子序列中
i=0;
while(i<dd&&down[i]<=a[u])i++;
t=down[i];
down[i]=a[u];
if(i<dd)dfs(u+1,uu,dd);
else dfs(u+1,uu,dd+1);
//恢复现场
down[i]=t;
}
int main()
{
//输入n,当n为0室结束while循环
while(cin>>n,n)
{
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
cnt=n;
dfs(0,0,0);
cout<<cnt<<endl;
}
return 0;
}
AcWing 187. 导弹防御系统
最新推荐文章于 2024-10-12 22:47:18 发布