参考链接:官方题解
这道题,不知道为什么,凭直觉写出来后ac,(好神奇)后来看题解才明白证明:首先每个数如果挪的话最多挪一次,其次必须先挪大的再挪小的,最后如果一个数上面有比它的的数,则它一定要挪,否则,不必挪。所以找书的每种放置状态下,需要挪的最大的那个编号的数就可以了。
已ac的代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
#define N 25
int order[N];
int place[N];
int n;
int dfs(){
for(int i=n-1;i>=1;i--){
if(place[i]>place[i+1]){
for(int j=place[i]-1;j>=1;j--){
order[j+1]=order[j];
}
order[1]=i;
for(int i=1;i<=n;i++){
place[order[i]]=i;
}
return dfs()+1;
}
}
return 0;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&order[i]);
place[order[i]]=i;
}
printf("%d\n",dfs());
}
return 0;
}