AcWing 180. 排书
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. 排书相关推荐
- 算法——AcWing算法提高课中代码和题解
文章目录 第一章 动态规划 (完成情况:64/68) 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP 第二章 搜索 ...
- AcWing算法提高课笔记
目录 Level2 1.动态规划--从集合角度考虑DP问题 1.1 数字三角形模型 1.1.1摘花生 1.1.2最低通行费 1.1.3方格取数 1.1.4传纸条 1.2 最长上升子序列模型 1.2.1 ...
- AcWing-算法提高课【合集】
算法提高 动态规划 数字三角形 1015. 摘花生 1018.最低通行费 1027. 方格取数 最长上升子序列LIS 1017. 怪盗基德的滑翔翼 1014.登山 482.合唱队形 1012. 友好城 ...
- latex/Xelatex书籍排版总结---顺便附上一本排好的6寸android书…
前言 园子里应该有不少朋友用latex 写文档,写论文,写简历,写博文,不知道有没有人用来排书?最近,学了一些latex顺便用它把android 设计指南,排成了6寸电子书的格式,手头上pad的,和e ...
- 数字三角形,最长上升子序列,背包模型 AcWing算法提高课 (详解)
目录 数字三角形模型(只能向右和向下或向左和向上) AcWing 1015. 摘花生 AcWing 1018. 最低通行费(曼哈顿距离-向右和向下-求最小值-初始化) AcWing 1027. 方格取 ...
- Acwing算法—动态规划
目录 数字三角形模型 AcWing 898. 数字三角形 AcWing 1015. 摘花生 AcWing 1018. 最低通行费 AcWing 1027. 方格取数 AcWing 275. 传纸条 最 ...
- acwing提高组 第一章 动态规划
文章目录 数字三角形模型 最长上升子序列模型 背包模型 状态机模型 状态压缩DP 区间DP 树形DP 数位DP 单调队列优化DP 斜率优化DP oj链接 数字三角形模型 AcWing 1015. 摘花 ...
- 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] ...
- 华为python673集_python库-collections模块Counter类
Counter类主要是用来跟踪值出现的次数.它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value. demo: all_words = [] # 列表里面是汉字(可 ...
最新文章
- java和c++的区别大吗_安徽成人高考和自考区别大吗?为什么推荐选成人高考?
- 设计模式--抽象工厂(Abstract Factory)模式
- 21天学通c++之7.10 for 循环 初始化多个变量
- C语言中的枚举和联合体
- Tarjan 强连通分量
- 前端学习(3157):react-hello-react之一个简单的helloworld
- 智能硬件的时代,嵌入式是否已经日薄西山
- 推荐:万能模板,十分钟打造电商首焦Banner
- 对Linux上的各类型压缩格式的一个总结
- FPGA远程更新之限制条件
- 计算机组成与系统结构概述
- (最完美)红米Note 5A的usb调试模式在哪里打开的步骤
- 通过微软官方工具卸载office
- 【数据分析与挖掘】淘宝用户行为分析(带数据集和代码)
- html5的canvas绘制迷宫地图
- java后台管理系统做Excel导入
- 机房的正确布线方法,四招轻松搞定!
- 代理arp 无故arp 反向arp
- 该如何提升自己的编程能力?
- python和正则表达式抽取文本化的信息
热门文章
- 苹果iPhone XI奋起直追?直接升级四摄镜头
- Facebook承认6亿用户密码可被员工随意读取:已修复故障
- 黑鲨游戏手机二代再曝新特性 “操控之王”带来全新体验
- 期待!2019年春晚将成为科技盛宴:5G、4K都安排上了
- 程序员加班到凌晨,第二天却被开除,了解原因后大家都说大快人心
- BFC(块级格式化上下文)【面试】
- Linux7081端口,bash,linux_利用shell将json数据解析后排序问题,bash,linux,ubuntu,json - phpStudy...
- c语言边界条件的设置,求解能不能用c或c++语言实现下面的约束条件
- oracle唯一索引能删除吗,Oracle:ora-02429:无法用于删除强制唯一/主键的索引 解决...
- 深入理解java虚拟机 - jvm高级特性与最佳实践(第三版)_深入理解Java虚拟机,JVM高级特性与最佳实践!...