題意:
有一張紙,被劃分成了n*m的格仔,每個格仔是黑色或者是白色的,每次可以選擇一條豎的或者橫的不跨越格仔的線,然後將紙對折。對折時要保證兩面對應的格仔顏色相同,且不能將大的一面覆蓋到小的上面。求若干次操作後不同的結局。結局不同當且僅當剩下的紙在原矩陣中位置不同。
n,m<=250
dp[u][d][l][r] 表示能否折成上邊u下邊d左邊l右邊r的矩形
列舉摺痕,判斷是否能折
時間複雜度為o(n^2 * m^2 *(n+m)* 判斷複雜度)
優化:橫著折和豎著折沒有影響
所以答案=橫著折的方案數*豎著折的方案數
那麼將矩形的每一列雜湊成1個格仔,就變成了1行,可以求豎著折的方案數
將矩形的每一行雜湊成1個格仔,就變成了1列,可以求橫著折的方案數
dp[l][r]表示能否折成[l,r]的格仔
列舉摺痕k,判斷是否能折
時間複雜度為o(n^3 * 判斷複雜度)
判斷可以列舉判斷,就是o(n^4)
再優化:
判斷是否可行實際上就是找到 以摺痕為中點的最長回文串長度
這個manacher預處理,就可以o(1)判斷
最後時間複雜度為o(n^3)
一道互動練習題
的做法 考慮逐位確定 對於每個位置,往後列舉有沒有位置可以使得正確位置更多,如果有,那麼有兩種情況,1是這個位置被放到了正確的位置,2是這個位置本來應該放的數被放來了 這裡的重點是我們需要區分1和2 具體的做法是記下讓這個位置答案正確位置數變大的2個位置,將其和i一起移位 這裡是手繪示意圖.即把p1...
一道fft練習題
考場上想到的o n 2 o n 2 o n2 暴力 記f i j f i j f i j 表示前i個位置,長度為j的連擊出現的期望次數 記g i j g i j g i j 表示第到i個位置為止,目前連擊次數為j的概率 轉移時有一些細節 include using namespace std con...
一道sam練習題
考慮答案實際上是每個子串的出現次數的平方和.這個可以通過手玩樣例驗證.考慮廣義sam 先將所有字串建成trie,然後再在trie上bfs,建出sam.考慮fail樹 每次插入乙個新節點,會改變從這個節點開始到根的路徑上的每個節點的right集合大小.所以考慮樹剖維護這種操作,然後每乙個單詞的答案就是...