一類棋盤互不攻擊問題

2021-09-05 19:45:56 字數 1398 閱讀 4739

一類棋盤互不攻擊問題

農夫三拳@seu([email protected])

最近在sgu上做了一些棋盤上互不攻擊的題目,稍稍的總結一下:

1. sgu 220 little bishops  以及 sgu 221 big bishops

問題:  求n*n的棋盤上放置k個互不攻擊的象的個數。

解法:  將棋盤旋轉45度之後,轉換成二維動態規劃求解。具體參見 黑書243~244頁

轉移的方程為 f(i,j) = f(i - 1, j) + f(i - 1, j - 1) * (ri - j + 1)

其中f(i,j)表示前i行放置j個象的總數,ri表示第i行的格仔總數。那麼顯然f(i - 1, j)就是第i行不放任何象,f(i - 1, j - 1) * (ri - j + 1)表示第i行放置1個象的情況。

2. sgu 222 little rooks

問題:  求n*n的棋盤上放置k個互不攻擊的車的個數。

解法:  組合公式,挑選k個行c(n,k),挑選k個列的排列a(n,k),所以總數為c(n,k)*a(n,k)

3. sgu 223 little kings

問題:  求n*n的棋盤上放置k個互不攻擊的王的個數。

解法:  狀態壓縮動態規劃。dfs預處理兩行之間的轉移狀態。

方程為:  f(i, j2, k) = sigma

f(i,j2,k)表示第i行狀態為j,前i行放置k個王的總數, f(i - 1, j1, k - one(j2)) 為第i - 1行狀態為j1(且j1和j2可以轉移),前i - 1行放置 k - one(j2)個王的總數。

顯然one(j2)為第i行放置的王的個數。

4.  sgu 224 little queens

問題:  求n*n的棋盤上放置k個互不攻擊的後的個數。

解法: 參加我的這篇文章 《k皇后問題》

5.  sgu 225 little knights

問題:  求n*n的棋盤上放置k個互不攻擊的馬的個數。

解法: 我的解法還做得不好,用的是和3中提到的相同的方法,不過時間複雜度太高了,貌似只能打表交。

我是用f(i,j2,j1,k)表示第i行狀態為j2,第i-1行狀態為j1,前i行放置k個馬的總數,那麼有

f(i,j2,j1,k) = sigma j0和j1能夠轉移到j2

不知道有沒有更好的解法,希望過路大牛指教下。

小結:

對於在棋盤上放置棋子互不攻擊的問題,如果問最值問題,例如:n*n的棋盤上最多能夠放多少個互不攻擊得象等等,問題通常可以轉換為二分圖模型來求解。

而對於更加通用的n*n棋盤上放置k個互不攻擊的棋子的問題,我知道的做法有兩種,一種是用容斥原理,另外一種就是狀態壓縮。其中後者更加通用一些。

歡迎指教!

一類求和問題 類歐幾里得

自 今天要來介紹的是用類歐幾里得演算法來解決一類求和問題。給出 n,a,b,c 對於每組資料,分別輸出 f,h,g 的值,答案對 998244353 取模。n leq 10 9 由於這三個函式是互相依賴的,所以我們將其放在乙個函式裡求解 分別算會產生大量的重複計算 include include u...

Integer一類的比較問題

總體主要分為兩個方面 比較的是值 一 基本資料型別與引用資料型別進行比較時,引用資料型別會進行拆箱 自動拆裝箱需要在jdk1.5以上 然後與基本資料型別進行值的比較 舉例 int i 12 integer j new integer 12 i j 返回的是true 二 引用資料型別與基本資料型別進行...

演算法 Fibonacci 數列的一類問題(一)

fibonacci 是演算法中的基礎問題。還有一些問題本質是fibonacci 問題,也就是遞迴問題。在此我們一併總結 1.fibonacci 數列 問題描述 數列位數序號 1,2,3,4,5,6,fibonacci 數列 1,1,2,3,5,8,fibonacci 數列的性質很簡單,就是從第三位起...