【Codeforces 142C】Help Caretaker
Codeforces 142 C
题意:给一个\(n\times m\)的空矩阵,求里面放最多的可旋转的\(T\)字形的个数,并输出方案。
思路1:
由于\(n\)和\(m\)比较小,所以可以尝试搜索。
对于每一个格子,尝试\(T\)字形的\(4\)种旋转方式,然后看\(T\)字形覆盖到的格子是否已经被覆盖了,如果没有那么就可以进入下一个格子。
这样是会\(TLE\)的。所以考虑最优性剪枝。对于这个格子,如果已经放的\(T\)字形的个数加上后面能放的最多个数(剩下的空格子/5)还不比最佳答案大,那么就不必继续了。
想一想后发现其实我们还能剪掉更多的枝叶。因为\(T\)字形的特殊性,它在放置的时候是不可能把能放的所有格子填满的,而是会浪费一些格子,所以我们有了一个大胆的想法:每个\(T\)字形会实际占据大于5个的格子数,这里通过调参得到6.5个格子的效果最好。所以就这样搜过去了。
思路2:
由于\(n\)和\(m\)比较小,所以可以考虑状态压缩动态规划。
首先假设当前处理到\((x,y)\)格子。我们知道每一个\(T\)字形会占据\(3\times 3\)的空间,然后就可以想到将\((x,y)\)一直到\((x+2,y+2)\)是否被\(T\)字形覆盖的情况都存下,即存\(2\times m+3\)个格子,也不会出现空间或时间不够的情况。
然后就可以想出\(dp\)状态和转移方程了:\(dp(x,y,mask)\)按照之前所说,考虑到\((x,y)\)这个格子,\((x,y)\)到\((x+2,y+2)\)的覆盖情况在\(mask\)中,最多放的\(T\)字形数量。
方程也就是考虑这里\(T\)字形放哪一种旋转的方式,将\(mask\)中相应的位置更改是否被覆盖的状态,注意需要判断一下是否原来没有被覆盖,如果已经被覆盖了就不能放。
最后就是要输出方案的问题了。
有两种方式:
- 像正常的\(dp\)一样对于每一个状态记录\(prev\)表示当前状态从哪一个状态转移来,从初始状态一直通过\(prev\)走到最终状态。
- 类似于重做一遍\(dp\),看当前的最大值由哪一个状态转移而来,然后一直走到最终状态。
【Codeforces 142C】Help Caretaker的更多相关文章
- 【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) = ...
- 【Codeforces 670C】 Cinema
[题目链接] http://codeforces.com/contest/670/problem/C [算法] 离散化 [代码] #include<bits/stdc++.h> using ...
- 【codeforces 515D】Drazil and Tiles
[题目链接]:http://codeforces.com/contest/515/problem/D [题意] 给你一个n*m的格子; 然后让你用1*2的长方形去填格子的空缺; 如果有填满的方案且方案 ...
随机推荐
- cookie、localStorage、sessionStorage的区别
localStorage - 没有时间限制的数据存储 sessionStorage - 针对一个 session 的数据存储 共同点:sessionStorage.localStorage和cooki ...
- Docker 启动遇到 Error starting daemon: Error initializing network controller 错误
docker 版本 1.10.3 一台装有 docker 的机器重启后,没法启动,/var/log/messages 展示如下错误信息: May 17 11:11:14 gziba-hc03 syst ...
- 微信小程序 封装请求
在写小程序的时候,每个JS文件都一大堆的请求,看得自己都眼花缭乱,下面看一下怎么对请求方法进行封装. 1,方法封装,在util文件夹下新建文件,创建request.js文件,工具文件,用于对方法封装) ...
- 洛谷P4555 [国家集训队]最长双回文串(manacher 线段树)
题意 题目链接 Sol 我的做法比较naive..首先manacher预处理出以每个位置为中心的回文串的长度.然后枚举一个中间位置,现在要考虑的就是能覆盖到i - 1的回文串中 中心最靠左的,和能覆盖 ...
- .NET代码设计简单规范
以下转载于:http://www.it28.cn/ASPNET/825095.html 下面这个规范是我为朋友写的几点建议,写的很范,作为BLOG,愿与大家一起分享.只给出部分设计规范样例,关于.NE ...
- 安卓开发-设置RadioButton的点击效果
在安卓开发中用到底部菜单栏 需要用到RadioButton这个组件 实际应用的过程中,需要对按钮进行点击,为了让用户知道是否点击可这个按钮,可以设置点击后 ,该按钮的颜色或者背景发生变化. layou ...
- 《Inside C#》笔记(十二) 委托与事件
C#的委托与C++的函数指针类似,但委托是类型安全的,意味着指针始终会指向有效的函数.委托的使用主要有两种:回调和事件. 一 将委托作为回调函数 在需要给一个函数传递一个函数指针,随后通过函数指针调用 ...
- [20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED.txt
[20180317]12c TABLE ACCESS BY INDEX ROWID BATCHED.txt --//简单探究12c TABLE ACCESS BY INDEX ROWID BATCHE ...
- Mysql基础之 binary关键字
where子句的字符串比较是不区分大小写的,但是可以使用binary关键字设定where子句区分大小写
- 彻底修改 Windows 系统用户名
在 Windows 安装的时候会输入一个用户名,电脑店装的一般都会给你设置成Admin之类的.这个时候你想要改成自己的,一般都是直接在 控制面板 > 用户帐户和家庭安全 > 用户帐户 &g ...