NOIP2018 填數游戲 搜索、DP


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)\),問題就完成了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM