【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的长方形去填格子的空缺; 如果有填满的方案且方案 ...
随机推荐
- Excel与minitab的不同
minitab是专业数据分析软件,可以直接通过导入数据源出结果,出图表, EXCEL的长处就是单元格可编辑,可视化强,也能做较多的分析,导入一些加载宏后功能更强大,但就分析能力而言,还 是比minit ...
- MEF 插件式开发之 DotNetCore 初体验
背景叙述 在传统的基于 .Net Framework 框架下进行的 MEF 开发,大多是使用 MEF 1,对应的命名空间是 System.ComponentModel.Composition.在 Do ...
- 2017-12-06 JavaScript实现ZLOGO子集: 单层循环功能
前文JavaScript实现ZLOGO子集: 前进+转向的示例代码很累赘, 因此尝试实现基本的循环功能, 使得前面的11行代码缩减为7行: 开始 循环4次 前进200 左转144度 到此为止 前进20 ...
- SD从零开始64-特异的业务交易(Special Business Transactions)
紧迫订单Rush Orders 紧迫订单和现金销售是用在从工厂销售流程可能用于当客户需要求即刻从货场获得他们的货物时的销售凭据种类: 在即刻交货的销售凭据种类中,即刻交货符号和交货种类DF是设置的:当 ...
- loadrunner 场景设计-手工场景方案(Schedule)设计
场景设计-手工场景方案(Schedule)设计 by:授客 QQ:1033553122 A. 定义方案schedule 在 Scenario Schedule面板中,选择一个方案schedule, ...
- Spooling Directory Source使用技巧
1.使用文件原来的名字 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 a1.sources=r1 a1.sinks=k1 a1.sources.r1.ty ...
- [LTR] RankLib.jar 包介绍
一.介绍 RankLib.jar 是一个学习排名(Learning to rank)算法的库,目前已经实现了如下几种算法: MART RankNet RankBoost AdaRank Coordin ...
- LazyMan深入解析和实现
一.题目介绍 以下是我copy自网上的面试题原文: 实现一个LazyMan,可以按照以下方式调用: LazyMan("Hank")输出: Hi! This is Hank! ...
- Python CNN卷积神经网络代码实现
# -*- coding: utf-8 -*- """ Created on Wed Nov 21 17:32:28 2018 @author: zhen "& ...
- [20170927]hugepages与内核参数nr_overcommit_hugepages.txt
[20170927]hugepages与内核参数nr_overcommit_hugepages.txt /proc/sys/vm/nr_overcommit_hugepages specifies h ...