题目链接:序列

Description

给定一个\(1\)~\(n\)的排列x,每次你可以将 \(x_1, x_2, ..., x_i\) 翻转。

你需要求出将序列变为升序的最小操作次数。

多组数据。

数据范围 \(T=5,1\le n\le 25\)

时间限制 \(10\ s\)

Solution

数据范围这么小,我们考虑用\(IDA*\)优化爆搜。

定义估价函数 \(h()=\sum_{i=2}^{n} [abs(x_i-x_{i-1})≠ 1]\)

考虑每一次翻转,最多可以使得\(abs≠1\)的对数减一,所以可以拿\(h()\)来进行估价。

直接爆搜即可。

复杂度 \(O(能过)\)

Code

// Author: wlzhouzhuan
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#include <bits/stdc++.h>
using namespace std; #define ll long long
#define ull unsigned long long
#define rint register int
#define rep(i, l, r) for (rint i = l; i <= r; i++)
#define per(i, l, r) for (rint i = l; i >= r; i--)
#define mset(s, _) memset(s, _, sizeof(s))
#define pb push_back
#define pii pair <int, int>
#define mp(a, b) make_pair(a, b) inline int read() {
int x = 0, neg = 1; char op = getchar();
while (!isdigit(op)) { if (op == '-') neg = -1; op = getchar(); }
while (isdigit(op)) { x = 10 * x + op - '0'; op = getchar(); }
return neg * x;
}
inline void print(int x) {
if (x < 0) { putchar('-'); x = -x; }
if (x >= 10) print(x / 10);
putchar(x % 10 + '0');
} int a[26], flag, n, maxd;
int h() {
int cnt = 0;
for (rint i = 2; i <= n; i++) if (abs(a[i] - a[i - 1]) != 1) {
cnt++;
}
return cnt;
}
bool check() {
for (rint i = 2; i <= n; i++) {
if (a[i - 1] > a[i]) {
return 0;
}
}
return 1;
}
void dfs(int x, int last) { // x表示操作次数,last表示上一次翻转的位置
if (flag) return ;
if (x == maxd) {
if (check()) flag = 1;
return ;
}
if (x + h() > maxd) {
return ;
}
for (rint i = 2; i <= n; i++) if (i != last) {
reverse(a + 1, a + i + 1);
dfs(x + 1, i);
reverse(a + 1, a + i + 1);
}
}
int main() {
int T = read();
while (T--) {
n = read();
for (int i = 1; i <= n; i++) {
a[i] = read();
}
flag = 0;
for (maxd = 0; maxd <= 30; maxd++) {
dfs(0, 0);
if (flag) break;
}
printf("%d\n", maxd);
}
return 0;
}

最新文章

  1. .net 单点登录实践
  2. 初识virtual memory
  3. HYSBZ 2002 分块
  4. [转]VS2010中如何创建一个WCF
  5. jmeter的http sample使用
  6. JQuery发送Ajax请求出现 500 Internal Server Error
  7. LeetCode之LRU Cache 最近最少使用算法 缓存设计
  8. IDEA中 @override报错的处理步骤
  9. [转] ArcEngine中打开各种数据源(WorkSpace)的连接
  10. (转)使用scp命令在linux操作系统之间传递文件
  11. Loadrunner11点击录制脚本无响应,IE页面弹不出——解决方案汇总
  12. Android 程式开发:(廿二)服务 —— 22.1 自定义服务
  13. 当执行游戏0xc000007b错误的解决方法
  14. [google面试CTCI] 2-0.链表的创建
  15. 虚拟机中ubuntu-16.04 Linux系统下配置mysql数据库,并在windows下使用navicat远程连接
  16. 【12】Django 中间件
  17. ECMAScript 6 学习(一)generator函数
  18. CentOS 网络设置
  19. Vue--生命周期函数
  20. SSH升级到7.7

热门文章

  1. 前端面试题整理——Javascript基础
  2. python-计算素数和
  3. mysql获取表的列名
  4. 每日所学之自学习大数据的Linux环境配置2
  5. CCF201712-2游戏
  6. 简单的axios请求返回数据解构赋值
  7. JavaScript实现有农历和节气节假日的日历
  8. IP和静态路由技术概述
  9. 五分钟搭建博客系统 OK?
  10. Codeforces Round #704 (Div. 2), problem: (C) Maximum width还是要多学习