loj 10170騎士 狀壓DP

2021-08-21 19:44:23 字數 1050 閱讀 8494

在n*n(1<=n<=10)的棋盤上放k(0<=k<=n*n)個國王(可攻擊相鄰的8 個格仔),求使它們無法互相攻擊的方案總數。

輸入檔案僅一行為兩個整數n和k。

輸出檔案僅一行為方案總數,若不能夠放置則輸出0。

3 2【樣例輸入2】

4 4【樣例輸出2】

79一眼狀壓,用1表示國王(話說真的不知道這個翻譯在幹什麼,到底是國王還是騎士啊……)

但是不能裸上,合法狀態事實上並不多,預處理一下每行的合法狀態,即不允許相鄰的1,存在陣列s裡

方程:當i - 1行的狀態為s[p],i行的狀態為s[j],且s[j]和s[p]不衝突時,f[i][j][k] += f[i - 1][p][k - sum[j]]; 其中sum表示該狀態1的個數,f[i][j][k]表示前i行中第i行為狀態s[j]且共有k個1

#include #define lowbit(x) x & -x

using namespace std;

const int maxs = 1050;

const int maxn = 11;

const int inf = 0x3f3f3f3f;

template inline void read(t &x)

}for (; isdigit(ch); ch = getchar())

if (fg) }

typedef pairpii;

typedef long long ll;

int s[maxs], cnt, n, all, sum[maxs], k;

ll f[maxn][maxs][maxn * maxn];

bool legal(int i)

void init() }}

bool chk(int s, int s0)

namespace dp

void dp() } }

}} }}

signed main()

printf("%lld\n", ans);

return 0;

}

AcWing1064 騎士(狀壓DP)題解

題目傳送門 題目描述 在 n n 的棋盤上放 k 個國王,國王可攻擊相鄰的 8 個格仔,求使它們無法互相攻擊的方案總數。輸入格式 共一行,包含兩個整數 n 和 k。輸出格式 共一行,表示方案總數,若不能夠放置則輸出00。資料範圍1 n 10 0 k n 2 輸入樣例 3 2 輸出樣例 題解 狀態壓縮...

LOJ 10172 塗抹果醬 狀壓DP

題目描述 看完題目,很清楚的想到這道題用狀壓dp來做,只不過這道題是個三進製的,做題過程中須注意轉換。下面簡單說一下演算法 1.用0 1 2 來代替題目中的1 2 3這樣比較方便,將第k行以三進製數存入。先用乙個陣列存所以可行的狀態,若第k行的狀態不在陣列裡,直接輸出0.2.這道題中已經給出了一行的...

loj 1021 狀壓dp 記憶化搜尋)

題目大意 給定的乙個某進製下的排列,問它的全排列有多少個能夠整除給定的十進位制下的數字k。思路 記憶化搜尋,dp state r 表示在某狀態下被k除餘數為r有多少個。1 include2 include3 include4 include5 include6 using namespace std...