N Queen Again LightOJ - 1061

首先预处理(或打表)出所有八皇后的解法(只有92种)。然后枚举目标状态,对于每一个目标状态用一个状压dp求出到达那个状态的最小费用。到达任何一个目标状态的最小费用就是答案。

显然,已知原来8个点的位置,要到达目标8个点的位置,就是使得每一个原来点匹配一个目标点。(为什么看到就想到爆搜?然而有比爆搜更好的..)

状压dp是:

ans[S]表示用[满足(编号被包含在S集合中)条件的所有目标点]去匹配原来点中的前 |S| (表示S集合的点的个数)个点的最小费用。

对于每一个枚举出的S,此时需要被匹配的点就是原来点的第 |S| 个,那么枚举从S中选择一个目标点去匹配它,记录最小的费用。

对于每一步的费用,有一个直觉做法:

如果原来点和目标点在同一位置,那么费用为0。否则如果在同一列或同一斜线,那么费用为1。否则费用为2。

然而这个直觉做法,在想出来之后很可能会下意识就否定掉,由于可能有已经摆好的或未摆好的棋子挡路。

然而事实上是对的:(如果不对这题就没法做了吧..)http://blog.csdn.net/xiefubao/article/details/25276999

(所以说..还是要大胆猜想,暴力对拍吗....感觉某些这种猜想,提出一个看上去正确的证明,都有可能遗漏了什么呢..所以即使想出了一个证明也不一定敢用猜想)

(这题根本没办法暴力对拍呢...所以还是要抱着对自己证明的信任?)

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int pre_ans[][],num_pre;
bool vis[],vis2[],vis3[];
int t1[],t2[],len;
int T,TT,now,anss,cnt;
int ans[];
void pre_dfs(int x)
{
if(x>)
{
++num_pre;
memcpy(pre_ans[num_pre],t1,sizeof(t1));
return;
}
int i;
for(i=;i<=;i++)
if(!vis[i]&&!vis2[x-i+]&&!vis3[x+i])
{
vis[i]=;
vis2[x-i+]=;
vis3[x+i]=;
t1[x]=i;
pre_dfs(x+);
vis[i]=;
vis2[x-i+]=;
vis3[x+i]=;
}
}
int get_dis(int a,int b)
{
if(a==t1[b]&&pre_ans[now][a]==t2[b]) return ;
if(a==t1[b]) return ;
if(pre_ans[now][a]==t2[b]) return ;
if(a+pre_ans[now][a]==t1[b]+t2[b]) return ;
if(a-pre_ans[now][a]==t1[b]-t2[b]) return ;
return ;
}
int main()
{
int i,j;
char c;
pre_dfs();
scanf("%d",&T);
for(TT=;TT<=T;TT++)
{
len=;anss=0x3f3f3f3f;
for(i=;i<=;i++)
for(j=;j<=;j++)
{
c=getchar();
while(c!='.'&&c!='q') c=getchar();
if(c=='q')
{
++len;
t1[len]=i;
t2[len]=j;
}
}
for(now=;now<=num_pre;now++)
{
memset(ans,0x3f,sizeof(ans));
ans[]=;
for(i=;i<(<<);i++)
{
cnt=__builtin_popcount(i);
for(j=;j<=;j++)
if(i&(<<(j-)))
ans[i]=min(ans[i],ans[i^(<<(j-))]+get_dis(j,cnt));
}
anss=min(anss,ans[(<<)-]);
}
printf("Case %d: %d\n",TT,anss);
}
}

N Queen Again LightOJ - 1061的更多相关文章

  1. lightoj 1061 - N Queen Again(状压dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1061 题解:显然能满足情况的8皇后的摆法不多,于是便可以用题目给出的状态来匹配 ...

  2. BZOJ 1061: [Noi2008]志愿者招募

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4064  Solved: 2476[Submit][Stat ...

  3. 【BZOJ 1061】【Vijos 1825】【NOI 2008】志愿者招募

    http://www.lydsy.com/JudgeOnline/problem.php?id=1061 https://vijos.org/p/1825 直接上姜爷论文... #include< ...

  4. 区间DP LightOJ 1422 Halloween Costumes

    http://lightoj.com/volume_showproblem.php?problem=1422 做的第一道区间DP的题目,试水. 参考解题报告: http://www.cnblogs.c ...

  5. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  6. LightOj 1298 - One Theorem, One Year(DP + 欧拉)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1298 题意:给你两个数 n, p,表示一个数是由前 k 个素数组成的,共有 n 个素数 ...

  7. 1214 - Large Division -- LightOj(大数取余)

    http://lightoj.com/volume_showproblem.php?problem=1214 这就是一道简单的大数取余. 还想还用到了同余定理: 所谓的同余,顾名思义,就是许多的数被一 ...

  8. 【九度OJ】题目1061:成绩排序

    题目描述: 有N个学生的数据,将学生数据按成绩高低排序,如果成绩相同则按姓名字符的字母序排序,如果姓名的字母序也相同则按照学生的年龄排序,并输出N个学生排序后的信息. 输入: 测试数据有多组,每组输入 ...

  9. LightOJ Beginners Problems 部分题解

    相关代码请戳 https://coding.net/u/tiny656/p/LightOJ/git 1006 Hex-a-bonacci. 用数组模拟记录结果,注意取模 1008 Fibsieve's ...

随机推荐

  1. activity栈管理的3种方式

    一.背景 在android开发过程最经常使用的组件非activity莫属. 通过分析activity的各种跳转,执行同学能够分析用户的各种行为.更重要的一点是在做插件化的过程中,我们经常会对activ ...

  2. apt仓库以及apt-get分析

    1 debian repository 参考:https://wiki.debian.org/DebianRepository 1.1 版本代号 sid,still in development,该版 ...

  3. camus gobblin

    ####Camus is being phased out and replaced by Gobblin. For those using or interested in Camus, we su ...

  4. __sizeof__()

    https://bugs.python.org/issue2898 https://bugs.python.org/file10353/footprint.patch Index: Python/sy ...

  5. Linux Linker Script

    先推荐两个网页: http://blog.csdn.net/muyuyuzhong/article/details/7755291 http://www.cnblogs.com/liulipeng/a ...

  6. aop+自定义注解

    自定义注解,并且实现,需要两个文件: 自定义注解类: package com.clc.server.annotation; import java.lang.annotation.ElementTyp ...

  7. python搭建httpserver

    因为手机要下载电脑上的文件,使用手机助手什么的经常出没反应,于是网上查了下,直接使用python搭建简单的HTTP服务器,之后在其运行目录下扔文件就行了.浏览器访问时可以直接显示相关的文件列表.参考了 ...

  8. 「LuoguP3865」 【模板】ST表 (线段树

    题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) 题目描述 给定一个长度为 N 的数列,和 M 次询问,求出每一 ...

  9. 区间DP中的环形DP

    vijos1312 链接:www.vijos.org/p/1312 题目分析:经典的环形DP(区间DP) 环形DP,首先解环过程,把数组复制一遍,n个数变成2n个数,从而实现解环 dp[i][j]表示 ...

  10. 区间DP 等腰三角形

    题目描述:给定一个正N边形,可以通过连线将这个多边形分割成N-2个三角形,问这N-2个三角形中恰有k个等腰三角形的分割方法有多少?这个值可能很大,输出对9397取模的结果.数据范围:n,k <= ...