版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37428263/article/details/89049197
//前一个分块中的最大值要<=下一个分块中的最小值
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
int b[15][15],c[15][15];
bool done[15];
int n;
bool dfs(int pos,int num,int sol[],int cnt)
{
if(cnt==num) {
sort(sol,sol+cnt);
int l,r;
l=0;
//闭区间
bool flag=true;
for(int i=0;i<cnt-1;i++)
{
if( b[ l ] [ sol[ i ] ] <= c[ sol[ i ]+1] [ sol[ i+1 ] ] ) {
l = sol[ i ]+1;
continue;
}
else
{
flag=false;
break;
}
}
if ( flag ) {
if( b[ l ] [ sol[cnt-1] ] <= c[ sol[cnt-1]+1 ][ n-1 ] )
return true;
else return false;
}
else return false;
}
for(int i=pos;i<n-1;i++)
{
if(!done[i]) {
done[i]=true;
sol[cnt]=i;
if(dfs(i,num,sol,cnt+1)) return true;
done[i]=false;
}
}
return false;
}
int main()
{
scanf("%d",&n);
int a[15];
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
for(int j=i;j<n;j++)
{
if(i==j) b[i][j]=c[i][j]=a[i];
else {
int m=-1,mi=INF;
for(int k=i;k<=j;k++)
{
m=max(m,a[k]);
mi=min(mi,a[k]);
}
b[i][j]=m;
c[i][j]=mi;
}
}
bool flag=false;
int solve;
for(int i=n;i>1;i--)
{
//cout<<i<<endl;
if(i==n) {
bool temp=false;
if(i==n) {
for(int j=0;j<n-1;j++)
{
if( a[j] > a[j+1] ) {
temp=true;
break;
}
}
if(temp) continue;
else {
flag=true;
solve=i;
}
}
}
else {
int sol[15];
memset(done,false,sizeof(done));
if(dfs(0,i-1,sol,0)) {
flag=true;
solve=i;
}
}
if(flag) {
cout<<solve<<endl;
break;
}
}
if(!flag) cout<<"1"<<endl;
return 0;
}