AStar 最坏情况\(O(log_2560 ^ 4)\)

用\(AStar\)算法做了这题,程序跑了\(408ms\)。
相比于\(IDA*\)的\(100ms\)左右要慢上不少。
且\(A*\)由于是\(bfs\),代码长度也较长。

跑的慢的原因应该有两点:

  • 用了三个\(STL\),垃圾STL毁我青春
  • 这题的指数暴涨,是\(560\),所以\(log\)反而比前几次叠加要大。

使用的估价函数是一样的,即:

\(h(n) = \lceil\frac{相邻位置不对的对数}{3}\rceil\)

估价函数详细的证明 & 解释见 y总的题解。


总结了一下应该在何时选择 \(A*\) 或 \(IDA*\):

  • 需要最小字典序时,状态表示很大,指数增长较快时,使用\(IDA*\)
  • 若状态容易表示,指数增长较慢时,使用\(A*\)(注意需要最小字典序时不能用\(A*\),因为他不是按照顺序搜索的)。

C++ 代码

#include <cstdio>
#include <iostream>
#include <unordered_set>
#include <queue>
using namespace std;
typedef unsigned long long ULL;
const int N = 15, B = 17;
int n;
struct State{//v表示当前的状态,step表示步数,f表示当前估计值(答案)int v[N], step, f;//重载小于号bool operator < (const State &x) const{return f > x.f;}
}Start;
//检测是否到了目标状态
bool check(State x){for(int i = 0; i < n; i++)if(x.v[i] != i + 1) return false;return true;
}
//用于检测一个状态是否已经访问过了
unordered_set<ULL> s;
priority_queue<State> q;//hash
ULL get(State x){ULL res = 0;for(int i = 0; i < n; i++)res = res * B + x.v[i];return res;
}
int f(State x){int res = 0;for(int i = 1; i < n; i++)if(x.v[i] - 1 != x.v[i - 1]) res++;return res % 3 ? res / 3 + 1 : res / 3;
}
int bfs(){while(q.size()) q.pop();Start.step = 0; Start.f = f(Start);q.push(Start); s.insert(get(Start));while(!q.empty()){State u = q.top(); q.pop();if(u.f >= 5) return 5;if(check(u)) return u.step;for(int l = 1; l < n; l++){for(int i = 0; i + l - 1 < n; i++){int j = i + l - 1;for(int k = i + l; k < n; k++){State v; for(int f = 0; f < n; f++) v.v[f] = u.v[f];for(int f = j + 1, t = i; f <= k; f++, t++)v.v[t] = u.v[f];for(int f = i, t = i + k - j; f <= j; f++, t++)v.v[t] = u.v[f];if(s.count(get(v)) > 0) continue; s.insert(get(v));v.step = u.step + 1;v.f = v.step + f(v);q.push(v);}}}}return 5;
}int main(){int T; scanf("%d", &T);while(T--){s.clear();scanf("%d", &n);for(int i = 0; i < n; i++)scanf("%d", &Start.v[i]);int res = bfs();if(res >= 5) puts("5 or more");else printf("%d\n", res);}return 0;
}

转载于:https://www.cnblogs.com/dmoransky/p/11404823.html

AcWing 180. 排书相关推荐

  1. 算法——AcWing算法提高课中代码和题解

    文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...

  2. AcWing算法提高课笔记

    目录 Level2 1.动态规划--从集合角度考虑DP问题 1.1 数字三角形模型 1.1.1摘花生 1.1.2最低通行费 1.1.3方格取数 1.1.4传纸条 1.2 最长上升子序列模型 1.2.1 ...

  3. AcWing-算法提高课【合集】

    算法提高 动态规划 数字三角形 1015. 摘花生 1018.最低通行费 1027. 方格取数 最长上升子序列LIS 1017. 怪盗基德的滑翔翼 1014.登山 482.合唱队形 1012. 友好城 ...

  4. latex/Xelatex书籍排版总结---顺便附上一本排好的6寸android书…

    前言 园子里应该有不少朋友用latex 写文档,写论文,写简历,写博文,不知道有没有人用来排书?最近,学了一些latex顺便用它把android 设计指南,排成了6寸电子书的格式,手头上pad的,和e ...

  5. 数字三角形,最长上升子序列,背包模型 AcWing算法提高课 (详解)

    目录 数字三角形模型(只能向右和向下或向左和向上) AcWing 1015. 摘花生 AcWing 1018. 最低通行费(曼哈顿距离-向右和向下-求最小值-初始化) AcWing 1027. 方格取 ...

  6. Acwing算法—动态规划

    目录 数字三角形模型 AcWing 898. 数字三角形 AcWing 1015. 摘花生 AcWing 1018. 最低通行费 AcWing 1027. 方格取数 AcWing 275. 传纸条 最 ...

  7. acwing提高组 第一章 动态规划

    文章目录 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP oj链接 数字三角形模型 AcWing 1015. 摘花 ...

  8. AcWing算法提高课

    1. 动态规划(43/68) 1.1 数字三角形模型(4/4) 1.1.1 AcWing 1015. 摘花生 结论: f[i][j]=max⁡(f[i−1][j],f[i][j−1])+w[i][j] ...

  9. 华为python673集_python库-collections模块Counter类

    Counter类主要是用来跟踪值出现的次数.它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value. demo: all_words = [] # 列表里面是汉字(可 ...

最新文章

  1. java和c++的区别大吗_安徽成人高考和自考区别大吗?为什么推荐选成人高考?
  2. 设计模式--抽象工厂(Abstract Factory)模式
  3. 21天学通c++之7.10 for 循环 初始化多个变量
  4. C语言中的枚举和联合体
  5. Tarjan 强连通分量
  6. 前端学习(3157):react-hello-react之一个简单的helloworld
  7. 智能硬件的时代,嵌入式是否已经日薄西山
  8. 推荐:万能模板,十分钟打造电商首焦Banner
  9. 对Linux上的各类型压缩格式的一个总结
  10. FPGA远程更新之限制条件
  11. 计算机组成与系统结构概述
  12. (最完美)红米Note 5A的usb调试模式在哪里打开的步骤
  13. 通过微软官方工具卸载office
  14. 【数据分析与挖掘】淘宝用户行为分析(带数据集和代码)
  15. html5的canvas绘制迷宫地图
  16. java后台管理系统做Excel导入
  17. 机房的正确布线方法,四招轻松搞定!
  18. 代理arp 无故arp 反向arp
  19. 该如何提升自己的编程能力?
  20. python和正则表达式抽取文本化的信息

热门文章

  1. 苹果iPhone XI奋起直追?直接升级四摄镜头
  2. Facebook承认6亿用户密码可被员工随意读取:已修复故障
  3. 黑鲨游戏手机二代再曝新特性 “操控之王”带来全新体验
  4. 期待!2019年春晚将成为科技盛宴:5G、4K都安排上了
  5. 程序员加班到凌晨,第二天却被开除,了解原因后大家都说大快人心
  6. BFC(块级格式化上下文)【面试】
  7. Linux7081端口,bash,linux_利用shell将json数据解析后排序问题,bash,linux,ubuntu,json - phpStudy...
  8. c语言边界条件的设置,求解能不能用c或c++语言实现下面的约束条件
  9. oracle唯一索引能删除吗,Oracle:ora-02429:无法用于删除强制唯一/主键的索引 解决...
  10. 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_深入理解Java虚拟机,JVM高级特性与最佳实践!...