【UVa】11212 Editing a Book(IDA*)

题目

题目
?



?

分析

get一下IDA*的技巧,感觉总体来说不难,主要是剪枝比较难想。
这是lrj的代码,比较通俗易懂,关键就是选定一个区间再取出来,插入到一个位置,接下来转移到这个状态。
?



?

代码

#include <bits/stdc++.h>
using namespace std;

const int maxn=10;
int n,a[maxn];

bool is_sorted()
{
    for(int i=0;i<n-1;i++)
        if(a[i]>=a[i+1]) return false;
    return true;
}

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

bool dfs(int d,int maxd)
{
    if(d*3+h() > maxd*3) return false;
    if(is_sorted()) return true;

    int b[maxn],olda[maxn];
    memcpy(olda,a,sizeof(a));
    for(int i=0;i<n;i++)
    for(int j=i;j<n;j++)
    {
        //cut
        int cnt=0;
        for(int k=0;k<n;k++)
            if(k<i || k>j) b[cnt++]=a[k];

        //insert
        for(int k=0;k<=cnt;k++)
        {
            int cnt2=0;
            for(int p=0;p<k;p++) a[cnt2++]=b[p];
            for(int p=i;p<=j;p++) a[cnt2++]=olda[p];
            for(int p=k;p<cnt;p++) a[cnt2++]=b[p];

            if(dfs(d+1,maxd)) return true;
            memcpy(a,olda,sizeof(a));
        }
    }
    return false;
}

int solve()
{
    if(is_sorted()) return 0;
    int max_ans=5;
    for(int maxd=1;maxd<max_ans;maxd++)
        if(dfs(0,maxd)) return maxd;
    return max_ans;
}
int main()
{
    int kase=0;
    while(scanf("%d",&n)==1 && n)
    {
        for(int i=0;i<n;i++) scanf("%d",&a[i]);

        printf("Case %d: %d\n",++kase,solve());
    }
    return 0;
}
时间: 2024-10-10 21:48:04

【UVa】11212 Editing a Book(IDA*)的相关文章

【UVA】10739 - String to Palindrome(动态规划)

比较水的动态规划 dp[i][j] 将原串 i ~ j 之内的字符转化为回文字符所需要的最小操作次数 其中删除操作和添加操作本质上是一样的. 三个状态转移方程: dp[i][j] = min(dp[i][j] ,dp[i + 1][j]); dp[i][j] = min(dp[i][j] ,dp[i + 1][j - 1]); dp[i][j] = min(dp[i][j] ,dp[i][j - 1]); 如果 i = j  dp[i][j] = 0; 14145138 10651 Pebble

【UVA】12504 Updating a Dictionary(STL)

题目 题目 ? ? 分析 第一次用stringstream,真TMD的好用 ? ? 代码 #include <bits/stdc++.h> using namespace std; int main() { int n; cin>>n; getchar();//回车 while(n--) { string s1,s2; getline(cin,s1); getline(cin,s2); for(int i=0;i<s1.length();i++) if(!isalpha(s1

【UVa】1606 Amphiphilic Carbon Molecules(计算几何)

题目 题目 分析 跟着lrj学的,理解了,然而不是很熟,还是发上来供以后复习 代码 1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn=1005; 5 6 struct Point 7 { 8 int x,y; 9 double rad; 10 bool operator < (const Point &rhs) const{ 11 return rad<rhs.rad; 12 } 13

【UVA】12504 - Updating a Dictionary(map,string,vector模拟)

一般的模拟题,一开始WA,可能是用string的容器放char,改成string就过了 14073581 12504 Updating a Dictionary Accepted C++ 0.032 2014-08-21 07:12:19 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<vector> #include<st

【UVa】12118 Inspector&#39;s Dilemma(欧拉道路)

题目 题目 ? ? 分析 很巧秒的一道题目,对着绿书瞎yy一会. 联一下必须要走的几条边,然后会形成几个联通分量,统计里面度数为奇数的点,最后再减去2再除以2.这样不断相加的和加上e再乘以t就是答案, 为什么呢?题目要求最短距离,那么必定是欧拉道路,那么为了构造出最短欧拉道路,要将奇度数的点减小至2个,然而各个道路不一定联通,还需要计算一下联通块数量n,结果加上n-1后,再乘t,因为需要n-1条边将各个联通块连接起来. 注意题目已保证每两个点都有路,所以上面才能那么肆无忌惮的连边. ? ? 代码

【原】AFNetworking源码阅读(六)

[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AFNetworking的网络安全策略,尤其指HTTPS(大家可以先简单了解下HTTPS).再一个就是分析下AFNetworkReachabilityManager文件,看看AFNetworking如何解决网络状态的检测. 2. AFSecurityPolicy - 网络安全策略 之前我们在AFURLS

【原】AFNetworking源码阅读(四)

[原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDelegate类所实现的NSURLSession相关的代理方法,甚至连dataTask.uploadTask.downloadTask这几个基本概念也没说.这一篇就是为了集中消灭这些遗留问题. 2. AFURLSessionManagerTaskDelegate的代理方法 此处实现的仍然是NSURLS

【原】SDWebImage源码阅读(三)

[原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们来到SDWebImageDownloader.m文件中,找到downloadImageWithURL函数.发现代码不是很长,那就一行行读.毕竟这个函数大概做什么我们是知道的.这个函数大概就是创建了一个SDWebImageSownloader的异步下载器,根据给定的URL下载image. 先映入眼帘的

【分析】dalvik虚拟机启动过程(二)

源码版本:Android-4.4.4_r2 提示:大部分分析直接注释在代码内. 接着上一篇[分析]dalvik虚拟机启动过程(一) JNI_CreateJavaVM函数调用dvmCreateJNIEnv创建JNIEnv后,接着又调用了dvmStartup函数初始化VM: /* * VM 初始化. * VM initialization. Pass in any options provided on the command line. * Do not pass in the class nam