hdu5500
参考链接:官方题解
这道题,不知道为什么,凭直觉写出来后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; }