UVa 11212 Editing a Book 编辑书稿 IDA* Iterative Deepening A Star 迭代加深搜剪枝

news2024/9/23 15:29:15

题目链接:Editing a Book
题目描述:

给定 n n n个( 1 < n < 10 ) 1<n<10) 1<n<10)数字,数字分别是 1 , 2 , 3 , . . . , n 1, 2, 3, ...,n 1,2,3,...,n,但是顺序是打乱的,你可以选择一个索引区间的数字进行剪切操作。问最少进行多少次剪切可以让这 n n n个数字变成升序。
例如 [ 1 , 2 , 4 , 3 ] [1, 2, 4, 3] [1,2,4,3]你可以选择剪切 3 3 3然后在 4 4 4的前面进行粘贴操作,那么该操作算一次剪切操作序列变得升序。

题解:

对于一个含有 n n n个数字的序列,要想让他变为升序,最多只需要进行 n n n次剪切操作一定能让序列升序(即每次都选择未剪切过的最大的数字剪切到开头,最多进行 n n n次操作,该序列一定变为有序)。那么我们可以依次枚举 [ 0 − n ] [0-n] [0n]表示可能的答案,每次进行暴力搜索,如果某一次枚举的时候搜索成功,那么此时枚举的次数就是最小的操作次数。这就是 I D ID ID算法( I t e r a t i v e D e e p e n i n g Iterative Deepening IterativeDeepening迭代深搜)。因为直接搜索的话,我们每次需要枚举区间以及移动的位置,那么复杂度会达到 ( n 3 ) d e p t h (n ^3)^{depth} (n3)depth带入最大值 9 9 9的话算出来的值接近 6 × 1 0 25 6\times 10^{25} 6×1025很明显会超时。
那么我们需要使用剪枝,如何进行剪枝呢?由于数字都是 1 − n 1-n 1n的,那么我们可以记录每个数字的后一个数字不正确的个数即计算有多少个 i i i满足: a [ i ] + 1 ] ≠ a [ i + 1 ] a[i] + 1] \ne a[i +1] a[i]+1]=a[i+1],我们将这个数字记为 c n t cnt cnt,我们可以发现我们每一次剪切操作最多让 c n t cnt cnt减少 3 3 3。从下图我们可以看到如果我们进行一次剪切(下图中是把part c移到到part b的前面),后一个数字发生变化的位置有:a的最后一个元素,c的最后一个元素, b的最后一个元素。 也就是说在这种情况想最多只有三个数字的后一个元素会发生改变,当然其他情况也是可以同理推出来的。所以每一次剪切操作最多能够让 c n t cnt cnt减少 3 3 3,如果剩余的剪切操作在最优的情况下不能让 c n t cnt cnt小于 0 0 0,那么此时就应该停止搜索即: ( m a x D e p t h − n o w D e p t h ) ∗ 3 < c n t (maxDepth - nowDepth) * 3 < cnt (maxDepthnowDepth)3<cnt。这也就是 A   s t a r A\ star A star算法的思想,三部分合起来就叫做 I D A ∗ IDA* IDA
在这里插入图片描述
实际上仅仅有上面的剪枝策略还是容易发生超时。而此时需要利用另外一种“贪心”策略:连续的升序区间不应该被执行剪切操作,也就是说对于一个序列里面类似于 [ 2 , 3 , 4 , 5 ] [2, 3, 4, 5] [2,3,4,5]的序列只能作为整体操作,而不应该只剪切其中的一部分。这似乎是显然的。

代码:

#include <bits/stdc++.h>

using namespace std;

int n, caseID = 1;
vector<int> number;

int getCnt()
{
    int cnt = 0;
    for (int i = 0; i < n - 1; i++) {
        if (number[i] + 1 != number[i + 1]) { cnt++; }
    }
    return cnt;
}

bool dfs(int nowDepth, int maxDepth)
{
    int cnt = getCnt();
    if (nowDepth == maxDepth) { return cnt == 0; }
    if ((maxDepth - nowDepth) * 3 < cnt) { return false; }
    for (int l = 0; l < n; l++) {
    	if (l - 1 >= 0 && number[l] - 1 == number[l - 1]) { continue; }
        for (int r = l; r < n; r++) { // 枚举需要移动的区间的左右端点
            if (r + 1 < n && number[r] + 1 == number[r + 1]) { continue; }
            for (int k = r + 2; k <= n; k++) { // 枚举将区间移动到k前面
                vector<int> temp(number);
                vector<int> worker;
                for (int i = 0; i <= k - 1; i++) { // [0, k-1]移动
                    if (l <= i && i <= r) { continue; }
                    worker.push_back(number[i]);
                }
                for (int i = l; i <= r; i++) { worker.push_back(number[i]); } // [l, r]移动
                for (int i = k; i < n; i++) { worker.push_back(number[i]); } // 剩下部分移动
                number.swap(worker);
                if (dfs(nowDepth + 1, maxDepth)) { return true; };
                number.swap(temp);
            }
        }
    }
    return false;
}

int main()
{
    ios::sync_with_stdio(false);
    while(cin >> n && n != 0) {
        number.resize(n);
        for (int i = 0; i < n; i++) { cin >> number[i]; }
        for (int maxDepth = 0; ; maxDepth++) {
            if (dfs(0, maxDepth)) {
                cout << "Case " << caseID << ": " << maxDepth << endl;
                caseID++;
                break;
            }
        }
    }
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/342753.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

即便考分很好也不予录取的研究生复试红线,都是原则性问题

在浙大研究生招生录取政策文件中有这么一句话&#xff1a;坚持“按需招生、全面衡量、择优录取、宁缺毋滥”的原则&#xff0c;以提高人才选拔质量为核心&#xff0c;在确保安全性、公平性和科学性的基础上&#xff0c;做到统筹兼顾、精准施策、严格管理。字字体现出研究生招生…

保姆级手把手教你如何使用HTTP远程连接Docker?

为什么要远程访问Docker? 可以使用http协议&#xff0c;获取json格式数据&#xff0c;很方便使用代码控制镜像&#xff0c;so easy 怎么配置才可以远程访问呢&#xff1f; 新建或修改这个文件&#xff1a;如果没有就新增哦~ /etc/systemd/system/docker.service.d/overrid…

Flink中核心重点总结

目录 1. 算子链 1.1. 一对一&#xff08;One-to-one&#xff0c; forwarding&#xff09; 1.2. 重分区&#xff08;Redistributing&#xff09; 1.3. 为什么有算子链 2. 物理分区&#xff08;Physical Partitioning&#xff09; 2.1. 什么是分区 2.2. 随机分区&#xff…

【Python学习笔记】30.Python3 命名空间和作用域

前言 本章介绍Python的命名空间和作用域。 命名空间 先看看官方文档的一段话&#xff1a; A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。 命名空间(Namespace)是从名称到对象的映射&#xff0c;大…

在中国程序员工作是青春饭吗?

上个月公司告诉我毕业了。 我打开boss直聘&#xff0c;一溜溜的外包公司和我打招呼。 我寻思我说不定啥时候就离开深圳了&#xff0c;外包不外包也无所谓钱到位就行。&#xff08;大公司学历不够格也进不去&#xff09; 结果华为、平安的外包告诉我&#xff0c;不好意思呀&a…

配置MyBatis Plus 的分页查询功能

配置MyBatis Plus 的分页查询功能一. 回顾Mysql分页查询二. 配置MyBatis Plus 分页功能2.1 配置分页拦截器2.2 进行分页查询三. 开启MyBatis Plus的运行日志一. 回顾Mysql分页查询 limit 是MySQL当中特有的&#xff01;其他数据库没有&#xff01;不通用&#xff1b;limit 是M…

ES6新增特性总结

目录 let和const命令 模板字符串 扩展运算符 解构赋值 对象解构 数组解构 扩展的函数 带参数默认值的函数 剩余参数表示不定参 箭头函数 扩展的对象 直接写入变量和函数&#xff0c;作为对象的属性和方法 新增Object.is()/Object.assign()/Object.keys/Object.val…

内网渗透(二十一)之Windows协议认证和密码抓取-Golden Ticket黄金票据制作原理及利用方式

系列文章第一章节之基础知识篇 内网渗透(一)之基础知识-内网渗透介绍和概述 内网渗透(二)之基础知识-工作组介绍 内网渗透(三)之基础知识-域环境的介绍和优点 内网渗透(四)之基础知识-搭建域环境 内网渗透(五)之基础知识-Active Directory活动目录介绍和使用 内网渗透(六)之基…

UI自动化测试是什么?什么项目适合做UI自动化测试

1. 页面对象设计模式的优势(1) 创建可以跨多个测试用例共享的代码(2) 减少代码的重复性(3) 如果界面需要维护&#xff0c;只需要修改一个地方&#xff0c;修改以及维护的成本减少2. 每个目录结构表达的意思(1) Base:基础层&#xff0c;是用来编写定位元素(2) Common&#xff1a…

[chatGPT] 如何通过JNI在Android上显示实时视频流

目录背景正文layout xmljavaCjava总结一&#xff1a;追问&#xff1a;CC总结二&#xff1a;答疑解惑C画蛇添足 视频不显示黑屏最后感叹科技的更新速度&#xff0c;真的程序员都可能会被替代&#xff0c;下一个时代最大的问题应该是劳动力过剩&#xff0c;导致社会性结构改变&am…

Hudi-集成 Hive

集成 Hive Hudi 源表对应一份 HDFS 数据&#xff0c;通过 Spark&#xff0c;Flink 组件或者 Hudi CLI&#xff0c;可以将 Hudi 表的数据映射为 *Hive 外部表*&#xff0c;基于该外部表&#xff0c; Hive可以方便的进行实时视图&#xff0c;读优化视图以及增量视图的查询。 集…

【软件相关】文献管理工具——Zotero

文章目录0 前期教程1 前言2 一些说明3 下载安装4 功能一&#xff1a;插入文献引用格式5 功能二&#xff1a;从网页下载文献pdf和题录6 功能三&#xff1a;数据多平台同步7 功能四&#xff1a;通过DOI添加条目及添加订阅8 安装xpi插件9 功能五&#xff1a;智能识别中英文文献10 …

The Number Of ThreadPoolExecutor

序言整理下Java 线程池中线程数量如何设置的依据巨人肩膀:https://blog.csdn.net/weilaizhixing007/article/details/125955693https://blog.csdn.net/yuyan_jia/article/details/120298564#:~:text%E4%B8%80%E4%B8%AA%E7%BA%BF%E7%A8%8B%E6%B1%A0%E5%A4%84%E7%90%86%E8%AE%A1,…

MongoDB--》文档查询的详细具体操作

目录 统计查询 分页列表查询 排序查询 正则的复杂条件查询 比较查询 包含查询 条件连接查询 统计查询 统计查询使用count()方法&#xff0c;其语法格式如下&#xff1a; db.collection.count(query,options) ParameterTypeDescriptionquerydocument查询选择条件optio…

int和Integer有什么区别?

第7讲 | int和Integer有什么区别&#xff1f; Java 虽然号称是面向对象的语言&#xff0c;但是原始数据类型仍然是重要的组成元素&#xff0c;所以在面试中&#xff0c;经常考察原始数据类型和包装类等 Java 语言特性。 今天我要问你的问题是&#xff0c;int 和 Integer 有什么…

JUC并发编程 Ⅱ -- 共享模型之管程(下)

文章目录wait notifywait / notify的原理API 介绍sleep与wait辨析优雅地使用wait/notify保护性暂停模式超时版 GuardedObjectjoin原理多任务版GuardedObject生产者-消费者模式定义实现Park & Unpark基本使用特点原理重新理解线程状态转换线程的活跃性死锁定位死锁活锁饥饿R…

vs2019 winform安装包,安装完成后默认启动

vs2019 winform安装包&#xff0c;安装完成后默认启动在要打包的项目中&#xff0c;新建安装类选中打包项目&#xff0c;右键&#xff0c;进入文件系统![在这里插入图片描述](https://img-blog.csdnimg.cn/62647c550ffa4d489f1d19f19bbd99b1.png)选中application folder 右键&a…

java微信小程序校园二手闲置商品交易跳蚤市场

基于跳蚤市场小程序的设计基于现有的手机,可以实现个人中心、用户管理、卖家管理、商品类型管理、商品信息管理、购物车管理、私聊信息管理、聊天回复管理、留言板管理、我的收藏管理、系统管理等功能。方便用户对商品信息等详细的了解及统计分析。根据系统功能需求建立的模块关…

后量子 KEM 方案:Kyber

参考文献&#xff1a; Bos J, Ducas L, Kiltz E, et al. CRYSTALS-Kyber: a CCA-secure module-lattice-based KEM[C]//2018 IEEE European Symposium on Security and Privacy (EuroS&P). IEEE, 2018: 353-367.Avanzi R, Bos J, Ducas L, et al. Crystals-kyber[J]. NIST…

AlphaFold 2 处理蛋白质折叠问题

蛋白质是一个较长的氨基酸序列&#xff0c;比如100个氨基酸的规模&#xff0c;如此长的氨基酸序列连在一起是不稳定的&#xff0c;它们会卷在一起&#xff0c;形成一个独特的3D结构&#xff0c;这个3D结构的形状决定了蛋白质的功能。 蛋白质结构预测&#xff08;蛋白质折叠问题…