交換遊戲 狀態壓縮 記憶化搜尋

2021-10-03 09:38:36 字數 965 閱讀 3335

題目描述:

一列上有12個孔,這12個孔中有些孔被遮擋住了。

假定我們用 『-』 來表示沒被遮擋住的孔,用 『o』 來表示被遮擋住的孔。

如果相鄰的三個孔有兩個孔被遮擋,並且被遮擋的兩個孔相鄰,就是 『-oo』 和 『oo-』。

對於這樣的三個孔,我們可以將中間的孔的遮擋物移開,代價是將一端的遮擋物移到另一端沒有被遮擋的孔上面。

對於一列給定的孔,你的任務是制定操作的順序,使得最後剩餘的被遮擋的孔的個數最少,並輸出最後剩餘的被遮擋的孔的個數。

輸入描述:

第一行輸入一n,n≤10^5 。

接下來n行,每行12個字元,代表孔的狀態。

思路:因為孔的個數只有12個,但詢問的次數很多,所以可以將這個包含『-』『o』的序列進行狀態壓縮,轉化成乙個01二進位制數。從第一位開始遍歷「oo」,如果「oo」有一邊有『-』,就分別dfs進下乙個狀態。同時在dfs過程中,記錄下已知情況的答案。(因為孔只有12個所以遞迴的次數也不會很多,不加記憶化也可以過?)

#include

#include

#include

#include

using namespace std;

//#define int long long

#define ll long long int

const

int manx=

1e5+

100;

const

int inf=

0x3f3f3f3f

;int dp[manx]

,vs[manx]

;int

dfs(

int x)

} vs[x]=1

;return dp[x]

=cnt;

}int

main()

return0;

}

收集紙片:狀態壓縮)

交換遊戲 記憶化搜尋,狀態壓縮,位運算

題目鏈結 一列上有12個孔,這12個孔中有些孔被遮擋住了。假定我們用 來表示沒被遮擋住的孔,用 o 來表示被遮擋住的孔。如果相鄰的三個孔有兩個孔被遮擋,並且被遮擋的兩個孔相鄰,就是 oo 和 oo 對於這樣的三個孔,我們可以將中間的孔的遮擋物移開,代價是將一端的遮擋物移到另一端沒有被遮擋的孔上面。對...

百練 4124 狀態壓縮 記憶化搜尋

傳送門 題意就不說了.題目要求是一定是從標號1出發,最後到達標號n,中間不重複的經過完其他島.那麼問題就是如何搜尋.中間有14個點,那麼最壞的情況就是14 中情況,這樣肯定是會超時的.所以我們需要剪枝,因為我們可以發現中途到達某個點時,如果此時的深度大於了曾經經過的點的深度或者目標點的深度,那麼直接...

uva 11008 狀態壓縮 記憶化搜尋

這題屬於狀態壓縮dp中比較基礎的一題,經過仔細分析後我們發現此題雖然座標範圍較大,但是點比較少最多才16個很容易想到用狀態壓縮。dp x 表示當前樹的狀態最少要轉移的次數 砍的次數 具體狀態轉移由於他狀態轉移的順序比較亂所以用的是記憶化搜尋。起始狀態是 1 如下 1 include 2 includ...