51nod 2502 最多分成多少块 dfs回溯

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}

猜你喜欢

转载自blog.csdn.net/m0_37428263/article/details/89049197