狀壓dp 洛谷P2622

2022-08-31 21:03:14 字數 1239 閱讀 1355

狀壓dp--洛谷p2622

現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈——按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一:如果a[i][j]為1,那麼當這盞燈開了的時候,把它關上,否則不管;如果為-1的話,如果這盞燈是關的,那麼把它開啟,否則也不管;如果是0,無論這燈是否開,都不管。

現在這些燈都是開的,給出所有開關對所有燈的控制效果,求問最少要按幾下按鈕才能全部關掉。

前兩行兩個數,n m

接下來m行,每行n個數,a[i][j]表示第i個開關對第j個燈的效果。

乙個整數,表示最少按按鈕次數。如果沒有任何辦法使其全部關閉,輸出-1

輸入 #1

3

21 0 1

-1 1 0

輸出 #1

2
對於20%資料,輸出無解可以得分。

對於20%資料,n<=5

對於20%資料,m<=20

上面的資料點可能會重疊。

對於100%資料 n<=10,m<=100

用二進位制位1表示第j盞燈開的情況,0表示關的情況,bfs搜所有情況

二進位制的運算稍加思考易懂

vis記錄步數,這裡由於初始為1,所以步數算多一步,答案輸出為前一步的vis

根據燈的所有狀態,vis大小最大為2^n=1024

#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairpdd;

typedef pairpll;

const ll n = 1e5+7;

const ll mod = 1e9+7;

const ll inf = 0x3f3f3f3f;

#define lson l, m, rt>>1

#define rson m+1, r, rt>>1|1

int a[105][15], n, m, vis[n];

void solve()

if(!next)

else if(!vis[next])}}

puts("-1");

}int main()

洛谷P2622 關燈問題II BFS 狀壓

有m mm個開關和n nn盞燈,第i ii個開關要麼可以開啟第j jj盞燈,要麼可以關上第j jj盞燈,要麼不對第j jj盞燈起作用。求把n nn盞燈全部開啟的最少步數。這道題很明顯可以用bfs bfsbf s做。因為對於每一種情況,我們也就只有m mm種轉移方法,而求的是最優解。而最多只有10盞燈...

洛谷P2622 關燈問題II BFS 狀壓

有mm 個開關和n n盞燈,第i i個開關要麼可以開啟第j j盞燈,要麼可以關上第j j盞燈,要麼不對第j j盞燈起作用。求把n n盞燈全部開啟的最少步數。這道題很明顯可以用bfs bfs做。因為對於每一種情況,我們也就只有m m種轉移方法,而求的是最優解。而最多只有10盞燈,所以可以想到用狀壓。這...

洛谷 P2622 關燈問題

輸入輸出樣例 說明切入正題 解 廣搜 手動分割 現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈 按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一 如果a i j 為1,那麼當這盞燈開了的時候,把它關上,否則不管 如果為 1的話,如果這盞燈是關的,那麼把它...