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 ...
随机推荐
- 面试题:android用户注册代码 密码需要加密传输吗
答案是肯定的,至少比明文好 客户端注册和登录的时候:一个可行的方法是,客户端提交 md5(password) 密码(如上所述,此方法只是简单保护了密码,是可能被查表获取密码的). 注册的时候:服务端数 ...
- mysql查询表大小
工作中常用命令参考,收集如下: 查询表大小:select table_name, data_length from information_schema.tables where table_sche ...
- asp.net core mvc基于Redis实现分布式锁,C# WebApi接口防止高并发重复请求,分布式锁的接口幂等性实现
使用背景:在使用app或者pc网页时,可能由于网络原因,api接口可能被前端调用一个接口重复2次的情况,但是请求内容是一样的.这样在同一个短暂的时间内,就会有两个相同请求,而程序只希望处理第一个请求, ...
- java.time.format.DateTimeParseException: Text '2019-10-11 12:30:30' could not be parsed at index 10
java.time.format.DateTimeParseException: Text '2019-10-11 12:30:30' could not be parsed at index 10 ...
- 201871010105-曹玉中《面向对象程序设计(Java)》第二周学习总结
201871010105-曹玉中<面向对象程序设计(Java)>第二周学习总结 项目 ...
- Educational Codeforces Round 78 (Rated for Div. 2) B - A and B(思维)
- OD(lfdnb)
由于一场意外,D死了,在此开一个新坑 2019.11.13 考前焦虑 智商为负 有点担心考试状态 2019.11.12 上午考试简直心态爆炸 T1看了一个小时不会 然后看T2,这时候wxy聚聚已经切了 ...
- PCM存储格式 Intel 和 Motorola
https://blog.csdn.net/cxz_yzxkj/article/details/84496614
- connect ECONNREFUSED 127.0.0.1:80错误解决
这个报错也是一直困扰了我许久,服务端一直打印这个报错,但是页面数据响应又都正常,起初真不知道是因为什么原因,能看出来他是在调用80端口, 但是不明白为什么会调用80端口.一度以为是config.js里 ...
- 20165230田坤烨网络对抗免考报告_Windows系统提权
目录 KERNEL EXPLOITATION 服务攻击: DLL劫持 攻击 不安全的服务权限 探测 unquoted path未被引号标记的路径 探测 攻击 服务注册表键 探测 攻击 Named Pi ...