Codeforces 111 C

题意:给\(n\times m\)的网格,每个点上有一个蜘蛛,每个蜘蛛可以向上、下、左、右走一步或者不动,问最多能存在多少没有蜘蛛的点。

思路1:

首先因为\(n\)和\(m\)中小的那个不可能超过\(6\),所以钦定\(m < n\)(因为如果\(n\)和\(m\)互换不影响答案)。

然后就可以考虑状压\(dp\)了。

首先我们看\((x,y)\)这个点上面可爱的小蜘蛛的去向。它可能会往上走,到\((x-1,y)\);也可能向下走,到\((x+1,y)\);也可能向左右走;所以就会发现在不断向下一个点移动的过程中,对于\((x,y)\)有影响的是从\((x-1,y)\)到\((x+1,y)\)的\(2\times m+1\)个点。所以\(dp\)状态和转移方程都可以求出辣:\(dp(x,y,mask)\)表示到了\((x,y)\)这个点,\(mask\)表示从\((x-1,y)\)到\((x+1,y)\)的点是否是蜘蛛集合点。

转移方程和\((x,y)​\)上的蜘蛛往哪个方向去走有关,或者它停在原地,它去的那个点必须是蜘蛛集合点,如果原来不是,那么答案必须加1。然后转移到下一个点即可。

思路2:

首先还是钦定\(m < n\)。

然后还是考虑状压\(dp\),其状态为\(dp(x,mask)\)。表示第\(x\)行时的状态。

这里\(mask\)保存的是当前行和上一行的所有的蜘蛛是否已经有地方去,然后转移的时候用\(dfs\)枚举一行中哪些点作为集合点(这里需要枚举所有集合点的集合),同时将其四周的点的状态赋为有地方去,然后让当前行的上一行不要有没地方去的点,继续考虑下一行的\(dp\)。

思路3:

钦定\(m < n​\),考虑状压\(dp​\),其状态为\(dp(x,mask)​\)。

这里\(mask\)保存的是当前行与上一行的集合点集,\(dp\)的值是考虑最多的空闲点的个数。

转移的时候枚举这一行新的集合点集以及下一行的集合点集,然后判断是否有当前行原来是集合点而现在不是的,有没有当前行没地方去的点,如果都没有就可以进入下一行的\(dp\)。

总结:

这3种思路较快的是思路1、2,然后较慢的是思路3,因为思路1的时间复杂度是\(O(n\times m\times 2^{2\times m+1})\),思路2的复杂度是\(O(n\times2^{3\times m})\),思路3的复杂度是\(O(n\times2^{4\times m})\)。

由此可见,状压\(dp\)的状态选择方面,对于复杂度是有非常大的影响的。

2019.03.03补充:
思路:我们考虑状压\(dp\)。\(dp(i,mask0,mask1)\)表示现在我们到了第\(i\)行,第\(i-1\)行的点中\(mask0\)内的的都被十字覆盖过了,第\(i\)行的点中\(mask1\)内的点都被十字覆盖过了,最少的十字数量。

现在枚举以第\(i\)行为中心的十字有哪些,存在\(mask2\)中。然后必须的是第\(i\)行的十字必须将\(mask0\)中可能有的一些空缺填满,然后并且会将\(mask1\)中的\(mask2\)中的点及其左右的点覆盖。这里可以用一种很简单的方式来表示\(mask2\)中的点及其左右:\(mask2|mask2<<1|mask2>>1​\)。

然后转移一下就很简单了。

【Codeforces 111C】Petya and Spiders的更多相关文章

  1. codeforces 111C/112E Petya and Spiders

    题目: Petya and Spiders传送门: http://codeforces.com/problemset/problem/111/C http://codeforces.com/probl ...

  2. 【Codeforces 1042D】Petya and Array

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 把a[i]处理成前缀和 离散化. 枚举i从1..n假设a[i]是区间和的a[r] 显然我们需要找到a[r]-a[l]<t的l的个数 即a ...

  3. 【codeforces 415D】Mashmokh and ACM(普通dp)

    [codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...

  4. 【codeforces 707E】Garlands

    [题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...

  5. 【codeforces 707C】Pythagorean Triples

    [题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...

  6. 【codeforces 709D】Recover the String

    [题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...

  7. 【codeforces 709B】Checkpoints

    [题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...

  8. 【codeforces 709C】Letters Cyclic Shift

    [题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...

  9. 【Codeforces 429D】 Tricky Function

    [题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...

随机推荐

  1. OSX系统下配置Apache+PHP+MySQL+Navicat

    概述 OSX系统对于PHP运行非常友好,我们只需要进行简单的配置便可以开始进行使用,本篇文章将一步一步地介绍Apache.PHP和MySQL的安装与配置,为开始进行开发铺好路 Apache 启动Apa ...

  2. Python全栈学习_day004作业

    ,写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", "barry&qu ...

  3. 网络编程学习二(IP与端口)

    InetAddress类 封装计算机的ip地址,没有端口 // 使用getLocalHost方法创建InetAddress对象 InetAddress addr = InetAddress.getLo ...

  4. python2&python3

    1.Python3 使用 print 必须要以小括号包裹打印内容,比如 print('hi')   Python2 既可以使用带小括号的方式,也可以使用一个空格来分隔打印内容,比如 print 'hi ...

  5. 2018-01-03 烂尾工程: Java实现的汇编语言编译器

    在半年前的中文编程的尝试历程小记中简单介绍了这一项目. 由于短期内估计不会继续进行, 而且这个项目好像是至今个人在中文命名实践中的代码量最大的一个项目, 谨在此作一小结. 最新的源码库在program ...

  6. 纯css实现元素下出现横线动画(background-image)

    效果图: html: <div class='site_bar'>首页</div> css: .site_bar{ background-image : linear-grad ...

  7. matlab练习程序(Levenberg-Marquardt法最优化)

    上一篇博客中介绍的高斯牛顿算法可能会有J'*J为奇异矩阵的情况,这时高斯牛顿法稳定性较差,可能导致算法不收敛.比如当系数都为7或更大的时候,算法无法给出正确的结果. Levenberg-Marquar ...

  8. Spark编译

    Spark的运行版本使用mvn编译,已经集成在源码中.如果机器有外网或者配置了http代理,可以直接调用编译命令来进行编译. windows&Linux命令如下: ./build/mvn \ ...

  9. UEditor单个图片上传遇到的问题记录

    查看了ueditor.all.js得源代码发现单图片上传是在选择文件输入框change事件执行表单Submit,但是出现一个问题请求头没有加入Cookie,导致后端身份认证失败,上传最终失败. ued ...

  10. [MapReduce_7] MapReduce 中的排序

    0. 说明 部分排序 && 全排序 && 采样 && 二次排序 1. 介绍 sort 是根据 Key 进行排序 [部分排序] 在每个分区中,分别进行排序 ...