就是一个迭代加深套剪枝。。。。
比较水?把
不用做什么其他优化就可以过去了。。。
其他优化比如,限制一次操作必须有对答案有贡献。。
缩小原状态规模,你每次单独移动一个,和你后面跟着的一起移动,没有影响的。。
然后。。。。。。我暂时想不到了,,还要去上晚修
不过有一句说一句,魔兽世界真好玩,硬是玩吐了。。。
#include<bits/stdc++.h>
using namespace std;
int T;
int n,a[25];
void init(){
cin>>n;
for(int i = 1 ; i <= n ; i++)cin>>a[i];
}
int f(){
int sum = 0;
for(int i = 1 ; i < n ; i++){
if(a[i + 1] != a[i] + 1)sum++;
}
return (sum + 2)/3;
}
int dfs(int now , int maxl){
if(now + f() > maxl)return 2;
//for(int i=1;i<=n;i++)cout<<a[i]<<" ";
//cout<<endl<<" "<<now<<endl;
if(f() == 0)return 1;
int b[25];
for(int r = 1 ; r <= n ; r++){
for(int l = 1 ; l <= r ; l++){
for(int k = 1 ; k < l && k + (r - l + 1) <= n; k++){
for(int i = 1 ; i <= n ; i++)b[i] = a[i];
for(int i = l - 1 ; i >= k ; i--)a[i + (r - l + 1)] = a[i];
for(int i = 0 ; i < (r - l + 1) ; i++)a[k + i] = b[l + i];
if(dfs(now + 1 , maxl) == 1)return 1;
for(int i = 1 ; i <= n ; i++)a[i] = b[i];
}
}
}
return 2;
}
void solve(){
int jl = 0;
while(dfs(0 , jl) ==2 && jl < 5){jl++;}
if(jl >=5 )cout<<"5 or more"<<endl;
else cout<<jl<<endl;
}
int main(){
cin>>T;
while(T--){
init();
solve();
}
}