【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的长方形去填格子的空缺; 如果有填满的方案且方案 ...
随机推荐
- 解决Linux服务器tomact-8.0启动慢的问题
环境信息: CentOS release 6.8 tomcat-8.0 JDK1.8 一.启动tomcat #sh /root/tomcat-8.0/bin/startup.sh #tailf /ro ...
- APP接口做什么?
提交数据:GET POST 有的接口是获取数据和提交数据相结合形式:如检测更新下载
- 启动weblogic服务时,还需要输入用户名和密码的解决方法
当启动weblogic服务时,还需要输入用户名和密码,相当繁琐,如下: 而在生产环境中,一般会要求不要在每次启动时都输入用户名密码, 因此可以通过一些简单的配置达到此目的,通常的做法有两种: 1.修改 ...
- Android项目实战(三十二):圆角对话框Dialog
前言: 项目中多处用到对话框,用系统对话框太难看,就自己写一个自定义对话框. 对话框包括:1.圆角 2.app图标 , 提示文本,关闭对话框的"确定"按钮 难点:1.对话框边框圆角 ...
- Flume Source 实例
Flume Source 实例 Avro Source 监听avro端口,接收外部avro客户端数据流.跟前面的agent的Avro Sink可以组成多层拓扑结构. 1 2 3 4 5 6 7 8 9 ...
- 洗礼灵魂,修炼python(14)--模块decimal, fractions,operator,collections以及精度介绍
decimal 1.作用: 用于浮点数计算.相比内置的二进制浮点数实现 float这个类型有助于 金融应用和其它需要精确十进制表达的场合,控制精度,控制舍入以适应法律或者规定要求,确保十进制数位精度, ...
- gridview导excel及解决导出中文乱码的方法
要全部展示数据,所以导出时要先将翻页取消,重新绑定数据:gridview的allowpaging属性设置为false,然后databind()一下 <%@ Page Language=" ...
- [cb]Unity 关卡编辑器 开发
关卡编辑器 关卡编辑器插件开发日记 1. Apply to Prefab [替换Prefab] if (GUILayout.Button("Apply Collider To Prefab& ...
- SSRS奇怪报错Could not update a list of fields for the quer.
今天遇到一个奇怪的问题,SSRS我觉得是个半成品,很多东西都搞不了.写了一段SQL,本来SQL写法都有点怪了,如下 WITH TMP_A AS (SELECT *,ROW_NUMBER() OVER( ...
- 薛兆丰吴军何帆曾鸣万维刚李笑来罗永浩等得到APP专栏作者的书23本
最近看了何帆的<大局观>,是他在得到APP的专栏文章的精选.顺便整理以下最近两三年内看过的得到APP其他专栏与课程作者的得到精选文集和他们写过的其他的书共23本. 薛兆丰 4星|<薛 ...