UVa11212,Editing a Book
正如书上所说,本题需要用IDA*算法求解
启发函数是3d+h>3maxd(d为当前操作步骤数,h为当前逆序对数,maxd为当前枚举的最大步骤数)
可见迭代递归的核心思想是枚举ans去dfs是否可行,相反常规搜索是dfs去需找ans。
一开始卡在状态图的转移与回溯上,参考(http://blog.csdn.net/sssogs/article/details/8836606)大神的代码后得到启发,可以将图或是表直接写成结构体或是类跟着递归走(当然,图或是表不能很大,比较大的话应该还是用回溯比较好吧)
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- #include <string>
- #include <algorithm>
- #define maxn 20
- using namespace std;
- int maxd,cnt;
- class MyClass{
- public:
- int map[maxn];
- int h,n;
- void move(int s,int e,int k){
- int t[maxn];
- for (int i=;i<k;i++){
- t[i]=map[i];
- }
- for (int i=s;i<=e;i++){
- t[k+i-s]=map[i];
- }
- int top=k+e-s;
- for (int i=k;i<n;i++){
- if (i<s||i>e) t[++top]=map[i];
- }
- memcpy(map,t,sizeof(t));
- }
- void move2(int s,int e,int k){
- int t[maxn],i,j;
- for (i=; i<s; i++)
- {
- t[i]=map[i];
- }
- for (j=e+; j<k; j++,i++)
- {
- t[i]=map[j];
- }
- for (j=s; j<=e; j++,i++)
- {
- t[i]=map[j];
- }
- for (j=k; j<n; j++,i++)
- {
- t[i]=map[j];
- }
- memcpy(map,t,sizeof(t));
- }
- int getH(){
- h=;
- for (int i=;i<n-;i++)
- if (map[i]+!=map[i+]) h++;
- if (map[n-]!=n) h++;//经过测试,这一句减掉了60%的搜索量.......之前一直TLE,天呢,又是一下午
- return h;
- }
- bool init(){
- cin>>n;
- if (n==) return false;
- for (int i=;i<n;i++){
- cin>>map[i];
- }
- return true;
- }
- };
- int IDAdfs(int d,MyClass c){
- c.getH();
- MyClass tc;
- cnt++;
- if (c.h==) return ;
- //if (d==maxd&&c.h>0) return 0;
- if (*d+c.h>*maxd) return ;
- for (int i=;i<c.n;i++)
- for (int j=i;j<c.n;j++){
- for (int k=;k<i;k++){
- tc=c;
- tc.move(i,j,k);
- if (IDAdfs(d+,tc)) return ;
- }
- for (int k=j+; k<c.n; k++)
- {
- tc=c;
- tc.move(i,j,k);
- if (IDAdfs(d+,tc) == true)
- return true;
- }
- }
- return ;
- }
- int main()
- {
- MyClass b;
- int prob;
- prob=;
- while (b.init() == true)
- {
- cnt=;
- for (maxd=; ; maxd++)
- {
- if (IDAdfs(,b) == true)
- break;
- }
- printf("Case %d: %d\n",prob,maxd);
- prob++;
- //cout<<cnt<<endl;
- }
- }
UVa11212,Editing a Book的更多相关文章
- 【Uva11212】 Editing a Book(IDA*)
[题意] 有n个数字的全排列,每次可以剪切一段粘贴到某个位置.问最后变成升序最少多少步. 如"{2,4,1,5,3,6}要2步 {3,4,5,1,2}只要一步 [分析] 迭代深搜真的AC了也 ...
- 3.2 配置构建Angular应用——简单的笔记存储应用
本节我们会通过构建一个简单的笔记存储应用(可以载入并修改一组简单的笔记)来学习如何应用Angular的特性.这个应用用到的特性有: 在JSON文件中存储笔记 展示.创建.修改和删除笔记 在笔记中使用M ...
- 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章 ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...
- Enterprise Library 服务问题
在使用Enterprise Library而没有注册服务的时候会出现这样的问题,"Editing Post "Failed to create instances of perfo ...
- UITableView的编辑模式
UITableView可以分普通模式和Editing模式两种,这里我们着重讨论Editing模式,Editing模式中又分三种操作:Insert.Delete. Reallocted.Insert和D ...
- Windows Community Toolkit 4.0 - DataGrid - Part02
概述 在上面一篇 Windows Community Toolkit 4.0 - DataGrid - Part01 中,我们针对 DataGrid 控件的 CollectionView 部分做了详细 ...
- 3.2.1 配置构建Angular应用——简单的笔记存储应用——展示功能
本节我们会通过构建一个简单的笔记存储应用(可以载入并修改一组简单的笔记)来学习如何应用Angular的特性.这个应用用到的特性有: 在JSON文件中存储笔记 展示.创建.修改和删除笔记 在笔记中使用M ...
- 框架入门经典项目TodoMVC
一.项目介绍 ①地址:http://todomvc.com/ ②GitHub下载模板 ③通过npm下载模板的样式 ④通过npm下载Vuejs ⑤项目文件,主要修改app.js和index.html两个 ...
- vue之TodoMVC项目实战
一.初始化项目 1.下载模板 进入github中https://github.com/tastejs/todomvc-app-template,并且在命令行将其clone下来 git clone ht ...
随机推荐
- 201521123004 《Java程序设计》第7周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 ArrayList代码分析 1.1 解释ArrayList的contains源代码 答:从ArrayList ...
- 201521123115《Java程序设计》第7周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 1.2 解释E re ...
- PHP封装数据库连接
将数据库连接放在类里面,用的时候直接实例化类. 将数据库地址,用户名,密码做成成员变量 将数据库连接做成成员方法,通过传入的sql语句返回结果集对象 class DBDA{ public $host= ...
- Calico 的默认连通性 - 每天5分钟玩转 Docker 容器技术(69)
前面我们完成了 Calico 网络的部署并运行了容器,今天将讨论 Calico 的连通性. 测试一下 bbox1 与 bbox2 的连通性: ping 成功,数据包流向如下图所示. ① 根据 bbox ...
- Java-判断一个数是不是素数
import java.util.Scanner; /** * @author 薛定谔的猫 * java判断一个数是不是素数 * * 素数又称质数,是指在一个大于1的自然数中,除了1和本身之外,不能被 ...
- [04] 利用注解生成实体类对应的建表sql语句
1.实现功能 我们已经对注解有了基本的认识,知道了如何自定义注解,如何使用和最基本的处理注解. 本篇主要介绍,如何使用运行时级别的注解,配合反射来自动生成建表的sql语句.如下例: 我们有实体类Stu ...
- 《Head First 设计模式》读书笔记(1) - 策略模式
<Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...
- Python学习笔记012_网络_异常
1,Python如何访问互联网? url + lib = urllib >>> # 使用urllib包下的request模块 >>> >>> i ...
- getOutputStream() has already been called for this response
错误日志里偶尔会有getOutputStream() has already been called for this response这个错误 最近发现了高概率复现条件,所以顺手解决了一下: 首先根 ...
- 用static声明的函数和变量小结
static 声明的变量在C语言中有两方面的特征: 1).变量会被放在程序的全局存储区中,这样可以在下一次调用的时候还可以保持原来的赋值.这一点是它与堆栈变量和堆变量的区别. 2).变量用static ...