显然到最终状态有一个下界,即为当前状态下,在最终状态中不相邻的相邻个数。
再加一些奇怪的剪枝就可以过了。另外这个题加强数据的题有剧毒。
#include <bits/stdc++.h> using namespace std; int b[60], a[60]; int pre, Ans; int n; int lim; inline int check() { int ret = 0; for(int i = 1; i < n; ++ i) { if(abs(a[i] - a[i + 1]) != 1) ++ ret; } return ret + (a[n] != n); } inline void dfs(int now) { if(check() + now > lim) return; if(now == lim) { for(int i = 1; i <= n; ++ i) if(a[i] != i) return; printf("%d ", lim); exit(0); } for(int i = 2; i <= n; ++ i) if(a[i + 1] - a[i] != 1) { for(int j = 1; j <= i / 2; ++ j) { swap(a[j], a[i - j + 1]); } dfs(now + 1); for(int j = 1; j <= i / 2; ++ j) { swap(a[j], a[i - j + 1]); } } } int main() { scanf("%d", &n); for(int i = 1; i <= n; ++ i) { scanf("%d", &b[i]); } for(int i = 1; i <= n; ++ i) { for(int j = 1; j <= n; ++ j) { if(b[j] <= b[i]) ++ a[i]; } } Ans = 2 * n - 2; for(lim = 1; lim <= 2 * n - 2; ++ lim) { dfs(0); } }