特殊方格取數
在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點。在走過的路上,...