Uva11212 Editing a Book【IDA*】【例题7-10】

题目:Editing a Book

题意:给n个数字,最少需要几次排成递增序列,可片段的插入。

思路:

(1)枚举:因为不确定最少几次排好,所以枚举步数:最多需8步,n<=9 .

(2)搜索:每次枚举当前要达到的深度(步数),然后进行dfs搜索

         dfs:用俩层循环枚举剪切片段的起始点和终止点,然后在剪切剩下的片段中将剪切片段依次在每一个位置的前面插入组成一个新序列后进行判断。

(3)判断: 每次组成一个新序列后进行判断是否为递增,是直接返回true。结束枚举。

(4)剪枝:求出每次的新序列的后继不正确的数字个数h可以证明每次剪切时h最多减少3 例如:序列 9 8 7 6 5 4 3 2 1    剪切部分:765      将 765 插入到 3与2之间,则 8 连接的是4 ,3连接的是7 ,2连接的是5 ,出现3处。

所以:3d+h>3maxd时可以剪枝,其中d为当前深度,maxd为深度限制

IDA* : 迭代深度搜索 + 超出范围的剪枝

参考:某大神链接

代码:

#include 
#include 
#include 
using namespace std;
const int maxn = 10;
int n,a[maxn];
bool is_sort(){//判断是否是递增序列
    for(int i=0;i 3*maxd) return false;//剪枝
    if(is_sort()) return true;
    int original[maxn],part[maxn];
    memcpy(original,a,sizeof(a));//保留原序列
    for(int i=0;i j) part[cnt_part++] = original[k];//将剪切判断除外的数字保留
            //将剪切部分依次插入原序列的每一个位置上,放入a数组中!,在k前插入!
            for(int k=0;k


你可能感兴趣的:(UVa,------搜索-------,IDA*,第7章,暴力求解法)