特殊方格取數

2021-07-27 15:25:38 字數 1092 閱讀 5060

特殊方格取數

在n*n(n≤20)的方格棋盤上放置n 個車,某些格仔不能放,求使它們不能互相攻擊的方案總數。

第一行,有兩個數 n 、 m ,n表示方格棋盤大小,m表示不能放的格仔數量

下面有m行,每行兩個整數,為不能放的格仔的位置。

只有一行,即得出的方案總數。

2 1

1 1

1動態規劃, 位運算, 排列組合, 狀態壓縮 ,容斥原理

用vis[i]表示第i行的放置情況(記錄不能放置的狀態),儲存乙個二進位制數,第j為0表示(i, j)沒有棋子,為1表示(i, j) 有棋子

對於不能放的地方,直接在二進位制的儲存中用1表示即可

然後對於每一種狀態,先統計出該狀態已經放置棋子的個數(用lowbit統計),放置了幾個棋子即為第即行(每行只能放置乙個棋子),然後統計出該狀態與改行不能放置的關係,如果有一位同為1,即該狀態不合法,找到合法狀態dp更新

#include #include #include #include #include #include #include #include #include #include #define l (1 << 20)

#define ll long long

using namespace std;

int n, m, a, b, cnt;

ll vis[30], f[l];

inline int lowbit(int x)

int main()

f[0] = 1;

for (int i = 1; i < (1 << n); ++i)

printf("%lld\n", f[(1 << n) - 1]);

return 0;

}

在將一種狀態與該行不能放置的情況進行比較時,需要注意只要有一位同為1即不合法,所以判斷方程應為:

if (!(vis[cnt] & lowbit(j)))

而不是:

if (vis[cnt] != lowbit(j))

因為判斷合法錯誤wa了一次

方格取數 1

problem description 給你乙個n n的格仔的棋盤,每個格仔裡面有乙個非負數。從中取出若干個數,使得任意的兩個數所在的格仔沒有公共邊,就是說所取的數所在的2個格仔不能相鄰,並且取出的數的和最大。input 包括多個測試例項,每個測試例項包括乙個整數n 和n n個非負數 n 20 ou...

方格取數 2

方格取數 2 時間限制 1 s 空間限制 128000 kb 題目描述 description 給出乙個n n的矩陣,每一格有乙個非負整數aij,aij 1000 現在從 1,1 出發,可以往右或者往下走,最後到達 n,n 每達到一格,把該格仔的數取出來,該格仔的數就變成0,這樣一共走k次,現在要求...

方格取數(dp)

時間限制 1 sec 記憶體限制 128 mb 提交 9 解決 4 提交 狀態 討論版 命題人 quanxing 設有n n的方格圖,我們在其中的某些方格中填入正整數,而其它的方格中則放入數字0。如下圖所示 某人從圖中的左上角a出發,可以向下行走,也可以向右行走,直到到達右下角的b點。在走過的路上,...