UOJ Logo peehs_moorhsum的博客

博客

一种特殊DP的奇怪优化方法

2017-03-09 14:19:03 By peehs_moorhsum

大家好!我是一只蒟蒻初二数竞选手

在一次数学课上,老师给我们留了一道题,我做了出来

我发现它可以出成OI题,于是开心地放到了校内UOJ上

直到WC讲课前,我发现这就是Stilwell的讲课内容ULAM游戏

是不是很有趣呀!

以上就是我写这篇博客的背景(其实真实原因是我给UOJ投题被大神退了)


以下是题面:

在ulam游戏中,考虑至多撒谎一次的情况。

告诉你至多撒谎一次的子集大小n, 不能撒谎的子集大小m,求出在两人都足够聪明的情况下,猜测者至少猜几次才能确认想数者所想的数。

数据范围:n, m <= 10^5000


这道题有明显的(nm)^2 dp解法

利用单调性,可以做到n(m^2)或(n^2)m*logm

再搞一搞,也许能搞到n^2

但是数据这么大,除非使用-wangyisong编译这种复杂度是显然过不了的

那么正解是什么呢?


对于一种特殊的二维DP,满足

1.对大小级别为n的x,y,dp[x][y]级别为f(n); 对级别为logn的dp[x][y], 一定有x,y的级别为f(n)

2.对相同的x,dp[x][y]随y上升单调不减

3.对dp[x1][y1], dp[x2][y2], 其能松弛的dp[x][y]中的x仅与x1,x2相关

那么我们令max[a][b]表示使dp[b][q]为a的最大q值,而后用DP方法维护max。于是我们就把复杂度优化到了 原复杂度*(f(n) / n)的级别


在这道题中,可以证明f(n) = logn + loglogn + k (其中abs(k) <= 2), 且满足以上的三条要求

于是我们就把复杂度优化到了n(m^2)logm啦!

是不是很厉害呢?


然而,我们悲伤地发现,上法还没有单调性dp快

考虑如何优化

在上述的特殊DP中,再加上几个条件

1.考虑max[x1][y1]=z1, max[x2][y2]=z2, 若松弛值q = h(z1, z2), 且h满足对a + b >= c + d, a >= b, c >= d, b >= d, 有h(a, b) >= h(c, d) (若干阶导数满足似乎亦可)

那么称h是"Slime"的(其实是一种类似于凸性的东西)

不难发现,原问题中的dp方程满足这一性质

而对于一个"Slime"的转移方程,其所被松弛的项的x下标是确定的

故此,我们可以将复杂度优化到nmlogm

虽然它仍跑不过,但已经很好了

兹兹不兹兹呀


接下来的优化方式,就比较简单了

可以利用数学方法证明,答案的取值范围介于log(n+m) + loglog(n+m) 正负常数(大概是2,3的范围) 的区间里

计算出与答案松弛相关的max坐标,总数的级别为logn

依次枚举每个答案,判断是否可行即可(其实可以不用枚举,但反正是常数,懒得算那么精确)

总复杂度为logn

其中高精度的运算过程并没有什么用,可以全部优化掉

但是...

我懒得优化了QwQ

于是出了log^2的范围


上课时曾和大神讨论过此问题,他告诉我计算熵的方法在至多撒谎一次的判断上是正确的

想了想,发现并不是...比如3,1就是反例

另外,这种dp能推广到撒谎更多次的情形(证明同理),复杂度为2^klogn 或 (2logn)^k

此类方法显然可以用到更多题上...不过由于我不是专业的OI选手,并未看过类似题目


UPD:我做麻烦了QwQ

但这种dp也许是有用的

我好菜呀O(∩_∩)O~

评论

chenyuqi
前排围观高二大神%%%
yanph2003
peehs_moorhsumを%してみる
Stilwell
对于撒谎一次的情况,设可能的数的范围是[1,M],那么当M为偶数的时候求min{n: M(n+1)<=2^n },当M为奇数的时候求min{n: M(n+1)+(n−1)<=2^n }请问这样还有反例吗? http://www.gwern.net/docs/2002-pelc.pdf
skyline
%%%

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。