P2534 [AHOI2012] 铁盘整理

/*
https://www.luogu.com.cn/problem/P2534
一串数字1-n 每次可以反转1-k 的区间 问最少要处理几次
搜索树非常大-> A*+。。->IDE 
估价函数选定 最好尽可能的小一些保证正确性 乐观估价<=实际大小  
1.计数不同 显然不符合
2.有几个单调序列 564321-》2  h()>=实际值 
3.有几个相邻差!=1 的序列 连接完好的序列中间不需要断开  
654321() 否则错误 

*/
/*
5
2 4 3 5 1

5
*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<queue>
#include<vector>
#include<bits/stdc++.h>
#define ll long long
#define ddd printf("-----------------------\n");
using namespace std;
const int maxn=1e1 +10;
const int mod=998244353;
const int inf=0x3f3f3f3f;

int n,a[20],b[20],flag;
 
int h()
{
    int cnt=0;
    for(int i=1;i<=n;i++) if(abs(a[i]-a[i+1])!=1) cnt++;// !!!!!!!!!!!!!!!!!!!!!!!
    return cnt; 
}
void dfs(int dep,int mdep,int pre)
{
    if(dep>=mdep)
    {
        if(h()==0) flag=1;
        return;
    }
    for(int i=1;i<=n;i++)
    {
        if(i==pre) continue;
        reverse(a+1,a+1+i);
        if(h()+dep<=mdep) dfs(dep+1,mdep,i);
        reverse(a+1,a+1+i);
    }
}

int main()
{
    ios::sync_with_stdio(false);

    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
    sort(b+1,b+1+n);
    for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+n,a[i])-b;
    a[n+1]=n+1;//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     
    for(int i=1;;i++)
    {
        dfs(0,i,0);
        if(flag==1){ cout<<i<<'\n'; return 0;}
    }

    return 0;
}

 

posted @ 2023-10-29 15:03  JMXZ  阅读(14)  评论(0)    收藏  举报