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 ...
随机推荐
- 201521123093 java 第七周学习总结
1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 //contains()方法 public boolean contains ...
- 201521123117 《Java程序设计》第7周学习总结
1. 本周学习总结 2.书面作业 Q1.ArrayList代码分析 1.解释ArrayList的contains源代码 源代码: //contains()方法 public boolean conta ...
- JAVA课程设计个人博客 学生成绩管理 201521123001 张陈东芳
1. 团队课程设计博客链接 http://www.cnblogs.com/kawajiang/p/7062407.html 2.个人负责模块或任务说明 我主要负责实现学生信息的添加功能.学生成绩的录入 ...
- Java:类类型变量
在java中有一种被称为类类型的变量,它不同于基本类型变量存储值的方式.不管是基本变量还是类类型变量,都实现为一个内存位置.但是,由于基本变量所需的内存数量是相同的,所以系统可以给它设置一个固定的空间 ...
- FreeMarker模板使用小结
手册写的不错,忘记的时候可以翻翻n(*≧▽≦*)n --------------------------------------------分割线--------------------------- ...
- linux下Nginx配置文件(nginx.conf)配置设置详解(windows用phpstudy集成)
linux备份nginx.conf文件举例: cp /usr/local/nginx/nginx.conf /usr/local/nginx/nginx.conf-20171111(日期) 在进程列表 ...
- PHP命令注入笔记
一.PHP命令注入介绍 在学习php相关的攻击时,遇到了Command Injection,即命令注入攻击,是指这样一种攻击手段,黑客通过把HTML代码输入一个输入机制(例如缺乏有效验证限制的表格域) ...
- mybatis(三)
上面2章写了mybatis的基本操作,今天就写写mybatis的动态代理吧. 动态代理有4个基本原则: 1.userMapper.xml里面的namespace="cn.my.dao.Use ...
- spring依赖注入中接口的问题
问题描述:一个接口,有俩个实现类当注入时候名字不同时,会出现不同的情况 action层: @Controller("userAction") @Scope("protot ...
- Redis学习——Redis事务
Redis和传统的关系型数据库一样,因为具有持久化的功能,所以也有事务的功能! 有关事务相关的概念和介绍,这里就不做介绍. 在学习Redis的事务之前,首先抛出一个面试的问题. 面试官:请问Redis ...