LOJ


感觉这个题十分好玩于是诈尸更博。一年之前的做题心得只有这道题还记得清楚……

设输入为\(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的更多相关文章

  1. 【题解】NOIP2018 填数游戏

    题目戳我 \(\text{Solution:}\) 题目标签是\(dp,\)但是纯暴力打表找规律可以有\(65\)分. 首先是对于\(O(2^{nm}*nm)\)的暴力搜索,显然都会. 考虑几条性质: ...

  2. [Noip2018]填数游戏

    传送门 Description 耳熟能详,就不多说了 Solution 对于一个不会推式子的蒟蒻,如何在考场优雅地通过此题 手玩样例,发现对于 \(n=1\) , \(ans=2^m\) .对于 \( ...

  3. 【比赛】NOIP2018 填数游戏

    打表找规律.... #include<bits/stdc++.h> #define ui unsigned int #define ll long long #define db doub ...

  4. @NOIP2018 - D2T2@ 填数游戏

    目录 @题目描述@ @题解@ @代码@ @题目描述@ 小 D 特别喜欢玩游戏.这一天,他在玩一款填数游戏. 这个填数游戏的棋盘是一个 n×m 的矩形表格.玩家需要在表格的每个格子中填入一个数字(数字 ...

  5. 【逆向笔记】2017年全国大学生信息安全竞赛 Reverse 填数游戏

    2017年全国大学生信息安全竞赛 Reverse 填数游戏 起因是吾爱破解大手发的解题思路,觉得题挺有意思的,就找来学习学习 这是i春秋的下载链接 http://static2.ichunqiu.co ...

  6. 1166 矩阵取数游戏[区间dp+高精度]

    1166 矩阵取数游戏 2007年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description [ ...

  7. 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 -- ...

  8. 计蒜客 取数游戏 博弈+dp

    题目链接 取数游戏 思路:dp(x, y)表示先手在区间[x, y]能取得的最大分数.当先手取完,就轮到后手去,后手一定会选择当前能令他得到最大分数的策略,其实当先手在[x, y]区间两端取走一个数, ...

  9. P1005 矩阵取数游戏 区间dp 高精度

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j​均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...

随机推荐

  1. App过大

    最近开发中遇到一个报错信息 如下 Error:Cannot fit requested classes in a single dex file.Try supplying a main-dex li ...

  2. FPM八:FPM TREE

    先上效果图: 1,新建类:ZCL_FPM_TREE,并添加接口:IF_FPM_GUIBB,IF_FPM_GUIBB_TREE.激活所有方法 2.定义tree结构,在class的public secti ...

  3. Centos7允许使用密码登录

      现在使用云主机比较多,所以一般都是使用秘钥登录,当做一个集群的时候需要几台机器之间免密登录时,就需要修改他的配置文件了,刚做运维那会儿,很熟练,现在忘得差不多了,特此记录一下,下次又这个需求时就不 ...

  4. 【爬虫】网页抓包工具--Fiddler--Request和Response

    [爬虫]网页抓包工具--Fiddler Fiddler基础知识 Fiddler是强大的抓包工具,它的原理是以web代理服务器的形式进行工作的,使用的代理地址是:127.0.0.1,端口默认为8888, ...

  5. CentOS 8 安装

    截止目前为止CentOS的最新版本为CentOS 8版本,接下来就介绍CentOS Linux 8.0.1905的安装过程 1. 安装CentOS 8 成功引导系统会显示如上图的界面: # 界面说明 ...

  6. nginx $remote_addr 详解

    1. 参考:https://blog.51cto.com/cuidehua/1827244?source=drt

  7. @Path注解

    最近用到的一个项目,看到Controller控制层.Method方法都是通篇的@Path注解,由于之前并没有使用过该注解,故记此篇. 首先看一下项目中的使用方式: @Path("client ...

  8. 掌握Visual Studio断点

    我知道你现在在想什么.断点?真的吗?关于断点有什么需要掌握的?你按F9然后停在代码行.如果你是这么想的,这篇文章是给你的:继续读 Visual Studio提供了一组相当丰富的断点类型和操作,可以使您 ...

  9. selenium--等待的三种方式

    前戏 在我们做UI自动化的时候,最不稳定的就是页面了,由于各种原因页面的元素没有加载出来,比如网速慢,服务器响应慢等等,这时候如果我们去操作页面的元素,selenium会给我们抛出一个NoSuchEl ...

  10. Linux进程通信的几种方式总结

    进程通信的目的 数据传输 一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间 共享数据 多个进程想要操作共享数据,一个进程对共享数据 通知事 一个进程需要向另一个或一组进程发 ...