諸侯安置 搜尋02 empire

2021-07-23 18:23:32 字數 1461 閱讀 9613

這道題目的第一感覺肯定是很像八皇后!!!可是它並不是八後所以我們需要使用一種逆向思維去思考!

題目大家應該都知道了,我就不講了,這裡主要講思路:

重新描述一下問題,其實就是在乙個邊長為 2n-1 的正菱形(如上左圖為 n=3的情形)上擺放 k 個棋子,使得任意兩個棋子都不在同一行、同一列。試問:這樣的擺法共有多少種?

看到這道題目,我們就會立即想起一道經典的老題目:n 皇后問題。這道題目與 n 皇后問題非常相似。但有兩個不同點:一是 n 皇后問題可以斜著攻擊對方棋子,而本題不能;二是 n 皇后問題是在 n,n 的正方形棋盤上面放置 k 個皇后,而本題卻是在乙個正菱形上擺放。我們試著先將 n 皇后變為不可斜攻的,再作思考,如果不能夠斜著攻擊,n 皇后的公式是:(c(k,n))^2*k!。但是本題不是乙個正方形,所以這個公式對本題好像沒有任何幫助。看來只能夠從另外乙個角度思考問題了。

首先想到在 2n-1 列中任意取出 k 列進行具體分析,這樣一來問題就轉化成:有乙個長為 k 的數列(無重複元素),每乙個數在乙個不定的區間[a,b]當中,第 i 個數一定在區間[ai,bi]之間,求這樣的數列有多少種? 如果就是這個問題,那麼比較難解決,但若把這個數列放在本題中,就比較簡單。

因為題目中任意兩個區間都是一種包含關係。可以先把區間按照長度排一下序,就可以看出來,再用乘法原理進行求解即可。但是,n 最多可到 100,k 最多可到 50,窮舉要進行 c(50,100)種方案! 顯然無法在 1s 內出解!那麼怎麼辦呢?

再繼續分析一下問題發現,裡面有重疊子問題。如果乙個列作為最後一列,且這一列以及前面所有列共放置 p 個諸侯,設有 q 種情況,那麼這一列後面的所有列共放置 p+1 個棋子的方案數都要用到 q,從而引用乘法原理。而且在窮舉過程中,這乙個工作做了許多遍,所以乾脆用遞推。遞推前,先把圖形轉化為類似右圖的形式(即列排序)。

設 f[i,j]表示以第 i 列為最後一列,放置 j 個棋子的總方案數,得出公式:

i-j+1

σf[i-k][j-1]*(i-j-1+i*2);

k=1

不過還要注意,當 k≥2n-1 時,問題無解。

下面放**:

#include

#include

int dp[5000][5000];

int main()

if(m>=n)

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

if(i%2==1)dp[i][1]=i;

else dp[i][1]=i-1;

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

for(j=2;j<=i;j++)

for(k=1;k<=i-j+1;k++)

for(i=m;im]+=dp[i][m];

dp[n][m]%=

504;

} printf("%d\n",dp[n][m]);

return

0;

}

諸侯安置(暴力搜尋)

題目 諸侯安置 問題描述 很久以前,有乙個強大的帝國,它的國土成正方形狀,如圖1 所示 這個國家有若干諸侯。由於這些諸侯都曾立下赫赫戰功,國王準備給他們每人一塊封地 正方形中的一格 但是,這些諸侯又非常好戰,當兩個諸侯位於同一行或同一列時,他們 就會開戰。如下圖2 為n 3 時的國土,陰影部分表示諸...

諸侯安置DP做法

這幾天考試,在考試中有這樣一道題叫 諸侯安置 沒過,但事後改對了。題目 諸侯安置 問題描述 很久以前,有乙個強大的帝國,它的國土成正方形狀,如圖1 所示 這個國家有若干諸侯。由於這些諸侯都曾立下赫赫戰功,國王準備給他們每人一塊封地 正方形中的一格 但是,這些諸侯又非常好戰,當兩個諸侯位於同一行或同一...

諸侯安置 簡單的遞推

problem description 很久以前,有乙個強大的帝國,它的國土呈正方形狀 45度看 如圖所示。這個國家有若干諸侯。由於這些諸侯都曾立下赫赫戰功,國王準備給他們每人一塊封地 正方形中的一格 但是,這些諸侯又非常好戰,當兩個諸侯位於同一行或同一列時,他們就會開戰。如下圖為n 3時的國土,陰...