题意 问最少有多少个上升子序列 和下降子序列 可以覆盖一个序列
#include<bits/stdc++.h> using namespace std; const int N=100; int a[N],up[N],down[N]; int n; bool dfs(int depth,int u,int su,int sd){ if(su+sd>depth) return false; if(u==n) return true; // 枚举所有可能的true; // up 数组; bool flag = false; for(int i=1;i<=su;i++){ if(a[u] > up[i]) { int t=up[i]; up[i] = a[u]; if(dfs(depth,u+1,su,sd)) return true; up[i]=t; flag = true; break; } } if(!flag) { up[su+1] =a[u]; if(dfs(depth,u+1,su+1,sd)) return true; } // 枚举下降 flag = false; for(int i=1;i<=sd;i++) { if(a[u] < down[i]) { int t=down[i]; down[i]= a[u]; if(dfs(depth,u+1,su,sd)) return true; down[i] = t; flag = true; break; } } if(!flag) { down[sd+1] = a[u]; if(dfs(depth,u+1,su,sd+1)) return true; } return false; } int main(){ while(cin>>n,n){ for(int i=0;i<n;i++){ cin>>a[i]; } int depth=0; while(!dfs(depth,0,0,0)) depth++; cout<<depth<<endl; } return 0; }