NOIP2018 填数游戏 搜索、DP
感觉这个题十分好玩于是诈尸更博。一年之前的做题心得只有这道题还记得清楚……
设输入为\(n,m\)时的答案为\(f(n,m)\),首先\(f(n,m)=f(m,n)\)所以接下来默认\(n \leq m\)。一件重要的事情是打表得到当\(m>n+1\)时\(f(n,m) = f(n,m-1)*3\),证明不会。
所以最后的问题是快速得到\(f(8,9)\)。\(n,m\)不大考虑搜索。
首先考虑一些没用的剪枝:
1、同一条对角线上填入的数字自底向上不增。这个不难反证得到。
2、如果存在\((i,j)\)和\((i+1,j-1)\)填入的数字相同,那么\((i+1,j)\)与\((n,m)\)构成的矩形中一条对角线上所有位置的值必须相同。也可以反证得到。
我们假设用了这些剪枝可以剪掉绝大部分状态,那么我们考虑如何check一个通过上述剪枝得到的答案是否合法。暴力的复杂度是\(15 \times \binom{15}{8}\)难以接受,我们考虑一些不同的思路。
对于两条路径\(P,Q\),找到第一次分岔的位置,记做\((x,y)\),那么这两条路径中必定一条向右走、一条向下走。不失一般性地假设\(P\)向右走,那么\(P\)得到的二进制串必须比\(Q\)得到的二进制串小。而\((x,y)\)是第一次分岔的位置,所以\(P,Q\)是否满足条件和\((x+1,y)\)以及\((x,y+1)\)作为起点的所有路径的串的\(\min\)和\(\max\)有关。如果能够得到从某个点开始到达终点的所有串的\(\min\)和\(\max\),判断合法就迎刃而解了。
对于求以任意位置作为起点到达终点的串的\(\min\)和\(\max\),考虑DP:设\(f_{i,j,0/1}\)表示从\((i,j)\)到\((n,m)\)的所有串的字典序\(\min / \max\),转移枚举下一步去到哪里。注意到DP的复杂度是\(O(nm)\)的,相比之前有很大的提升。
这样有可能还是跑不进\(2s\),但是注意到下面check合法则上面所有的剪枝都一定满足。如果可以最大化check方式在搜索中的剪枝效果,就可以更快速地搜出结果。
那么可以这样做:按照对角线倒着填数,每一次填入一个位置之后立即计算它的DP值,判断能够判断是否合法的位置,如果某些位置作为第一次分岔的位置已经不合法,则不往下搜。不难发现这样的搜索剪枝是包含了上面的剪枝1、2的,是一个更强的剪枝。这样你就可以在LOJ上以\(200ms\)的速度搜出\(f(8,9)\),问题就完成了。
NOIP2018 填数游戏 搜索、DP的更多相关文章
- 【题解】NOIP2018 填数游戏
题目戳我 \(\text{Solution:}\) 题目标签是\(dp,\)但是纯暴力打表找规律可以有\(65\)分. 首先是对于\(O(2^{nm}*nm)\)的暴力搜索,显然都会. 考虑几条性质: ...
- [Noip2018]填数游戏
传送门 Description 耳熟能详,就不多说了 Solution 对于一个不会推式子的蒟蒻,如何在考场优雅地通过此题 手玩样例,发现对于 \(n=1\) , \(ans=2^m\) .对于 \( ...
- 【比赛】NOIP2018 填数游戏
打表找规律.... #include<bits/stdc++.h> #define ui unsigned int #define ll long long #define db doub ...
- @NOIP2018 - D2T2@ 填数游戏
目录 @题目描述@ @题解@ @代码@ @题目描述@ 小 D 特别喜欢玩游戏.这一天,他在玩一款填数游戏. 这个填数游戏的棋盘是一个 n×m 的矩形表格.玩家需要在表格的每个格子中填入一个数字(数字 ...
- 【逆向笔记】2017年全国大学生信息安全竞赛 Reverse 填数游戏
2017年全国大学生信息安全竞赛 Reverse 填数游戏 起因是吾爱破解大手发的解题思路,觉得题挺有意思的,就找来学习学习 这是i春秋的下载链接 http://static2.ichunqiu.co ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- BZOJ 1978: [BeiJing2010]取数游戏 game( dp )
dp(x)表示前x个的最大值, Max(x)表示含有因数x的dp最大值. 然后对第x个数a[x], 分解质因数然后dp(x) = max{Max(t)} + 1, t是x的因数且t>=L -- ...
- 计蒜客 取数游戏 博弈+dp
题目链接 取数游戏 思路:dp(x, y)表示先手在区间[x, y]能取得的最大分数.当先手取完,就轮到后手去,后手一定会选择当前能令他得到最大分数的策略,其实当先手在[x, y]区间两端取走一个数, ...
- P1005 矩阵取数游戏 区间dp 高精度
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...
随机推荐
- App过大
最近开发中遇到一个报错信息 如下 Error:Cannot fit requested classes in a single dex file.Try supplying a main-dex li ...
- FPM八:FPM TREE
先上效果图: 1,新建类:ZCL_FPM_TREE,并添加接口:IF_FPM_GUIBB,IF_FPM_GUIBB_TREE.激活所有方法 2.定义tree结构,在class的public secti ...
- Centos7允许使用密码登录
现在使用云主机比较多,所以一般都是使用秘钥登录,当做一个集群的时候需要几台机器之间免密登录时,就需要修改他的配置文件了,刚做运维那会儿,很熟练,现在忘得差不多了,特此记录一下,下次又这个需求时就不 ...
- 【爬虫】网页抓包工具--Fiddler--Request和Response
[爬虫]网页抓包工具--Fiddler Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888, ...
- CentOS 8 安装
截止目前为止CentOS的最新版本为CentOS 8版本,接下来就介绍CentOS Linux 8.0.1905的安装过程 1. 安装CentOS 8 成功引导系统会显示如上图的界面: # 界面说明 ...
- nginx $remote_addr 详解
1. 参考:https://blog.51cto.com/cuidehua/1827244?source=drt
- @Path注解
最近用到的一个项目,看到Controller控制层.Method方法都是通篇的@Path注解,由于之前并没有使用过该注解,故记此篇. 首先看一下项目中的使用方式: @Path("client ...
- 掌握Visual Studio断点
我知道你现在在想什么.断点?真的吗?关于断点有什么需要掌握的?你按F9然后停在代码行.如果你是这么想的,这篇文章是给你的:继续读 Visual Studio提供了一组相当丰富的断点类型和操作,可以使您 ...
- selenium--等待的三种方式
前戏 在我们做UI自动化的时候,最不稳定的就是页面了,由于各种原因页面的元素没有加载出来,比如网速慢,服务器响应慢等等,这时候如果我们去操作页面的元素,selenium会给我们抛出一个NoSuchEl ...
- Linux进程通信的几种方式总结
进程通信的目的 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另一个或一组进程发 ...