【Codeforces 111C】Petya and Spiders
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的更多相关文章
- codeforces 111C/112E Petya and Spiders
题目: Petya and Spiders传送门: http://codeforces.com/problemset/problem/111/C http://codeforces.com/probl ...
- 【Codeforces 1042D】Petya and Array
[链接] 我是链接,点我呀:) [题意] 题意 [题解] 把a[i]处理成前缀和 离散化. 枚举i从1..n假设a[i]是区间和的a[r] 显然我们需要找到a[r]-a[l]<t的l的个数 即a ...
- 【codeforces 415D】Mashmokh and ACM(普通dp)
[codeforces 415D]Mashmokh and ACM 题意:美丽数列定义:对于数列中的每一个i都满足:arr[i+1]%arr[i]==0 输入n,k(1<=n,k<=200 ...
- 【codeforces 707E】Garlands
[题目链接]:http://codeforces.com/contest/707/problem/E [题意] 给你一个n*m的方阵; 里面有k个联通块; 这k个联通块,每个连通块里面都是灯; 给你q ...
- 【codeforces 707C】Pythagorean Triples
[题目链接]:http://codeforces.com/contest/707/problem/C [题意] 给你一个数字n; 问你这个数字是不是某个三角形的一条边; 如果是让你输出另外两条边的大小 ...
- 【codeforces 709D】Recover the String
[题目链接]:http://codeforces.com/problemset/problem/709/D [题意] 给你一个序列; 给出01子列和10子列和00子列以及11子列的个数; 然后让你输出 ...
- 【codeforces 709B】Checkpoints
[题目链接]:http://codeforces.com/contest/709/problem/B [题意] 让你从起点开始走过n-1个点(至少n-1个) 问你最少走多远; [题解] 肯定不多走啊; ...
- 【codeforces 709C】Letters Cyclic Shift
[题目链接]:http://codeforces.com/contest/709/problem/C [题意] 让你改变一个字符串的子集(连续的一段); ->这一段的每个字符的字母都变成之前的一 ...
- 【Codeforces 429D】 Tricky Function
[题目链接] http://codeforces.com/problemset/problem/429/D [算法] 令Si = A1 + A2 + ... + Ai(A的前缀和) 则g(i,j) = ...
随机推荐
- 再也不用担心面试官问你HashCode和equals了
结论 如果两个对象相等,则hashcode()必须相等. 如果两个对象相等,a.equals(b)==b.equals(a)==true 如果两个对象有相同的hashcode值,他们也不一定是相等的. ...
- JS之用ES6 Promise解决回调地狱(这里以小程序为例)
首先 写一个请求的方法,如: /** * 银行窗口 * 你需要给我提供相关的相关参数我帮你提交到服务器上 * 我会给你一个等待区的编号给你 你去等待区等待,我处理完成会去等待区通知你 * @param ...
- HTML5本地存储localStorage与sessionStorage详解
前言 在最近的项目中用到了html5的本地存储,下面总结一下. 1.html5几种存储形式 本地存储(localStorage && sessionStorage) 离线缓存(appl ...
- ThreadLocal终极源码剖析-一篇足矣!
本文较深入的分析了ThreadLocal和InheritableThreadLocal,从4个方向去分析:源码注释.源码剖析.功能测试.应用场景. 一.ThreadLocal 我们使用ThreadLo ...
- 外网访问局域网ip的方法
https://jingyan.baidu.com/article/48b558e335e3ac7f39c09a59.html 步骤: 1.浏览器内输入:192.168.1.1进入路由器管理界面 2. ...
- .Net Core 2.0 生态(2).NET Core 2.0 特性介绍和使用指南
.NET Core 2.0发布日期:2017年8月14日 前言 这一篇会比较长,介绍了.NET Core 2.0新特性.工具支持及系统生态,现状及未来计划,可以作为一门技术的概述来读,也可以作为学习路 ...
- Java 中声明和语句
public class Example { int[] arr = new int[4]; // OK! 定义属性并初始化 arr[0] = 1; // 错误! 这是语句,必须写在方法体里 arr[ ...
- 游标和递归sql 的一些代码
DECLARE @UserID INT; --推广员帐号 DECLARE @ProxyID INT; --代理帐号 ; --分数 SELECT @UserID = [SpreaderID] FROM ...
- IntelliJ IDEA 2017 永久注册方法
https://blog.csdn.net/weixin_39913200/article/details/80859897 在安装的idea下面的bin目录下面有2个文件 : 一个是idea64.e ...
- C#语言————拼接、插入、替换、删除四种方法
StringBuilder sb = new StringBuilder("hello"); sb.Append("world");//拼接 sb.Insert ...