諸侯安置DP做法

2021-07-15 16:48:49 字數 1114 閱讀 4690

這幾天考試,在考試中有這樣一道題叫「諸侯安置」沒過,但事後改對了。

題目:諸侯安置

【問題描述】

很久以前,有乙個強大的帝國,它的國土成正方形狀,如圖1 所示

這個國家有若干諸侯。由於這些諸侯都曾立下赫赫戰功,國王準備給他們每人一塊封地

(正方形中的一格)。但是,這些諸侯又非常好戰,當兩個諸侯位於同一行或同一列時,他們

就會開戰。如下圖2 為n=3 時的國土,陰影部分表示諸侯所處的位置。前兩幅圖中的諸侯可

以互相攻擊,第三幅則不可以。

國王自然不願意看到他的諸侯們互相開戰,致使國家動盪不安。因此,他希望通過

合理的安排諸侯所處的位置,使他們兩兩之同都不能攻擊。

現在,給出正方形的邊長n,以及需要封地的諸侯數量k,要求你求出所有可能的安置

方案數。(n≤100,k≤2n2-2n+1)

由於方案數可能很多,你只需要輸出方案數除以504 的餘數即可。

【輸入】

僅一行,兩個整數n 和k,中閽用一空格隔開。

【輸出】

乙個整數,表示方案數除以504 的餘數。

【樣例】

empire.in empire.out

2 2 4

本題我們先寫dp做法,我們可以設定乙個dp陣列,讓他的第一維來表示到第幾列了,第二維表示能放幾個諸侯。我們使列每次從左向右加一,由此得到每一列前最多能放多少個諸侯。而列的總數是n*2-1。在這要特別提醒大家,當i為奇數是最多有i種情況,可當i為偶數時卻只有i-1種情況。 

#include#includeusing namespace std;

int n,empire,ans = 0;

int territory[250][250],q[250];

int p;

void init()

if(empire>=2*n-1)

p = n*2-1;//最多能有多少列

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

else }}

void work()

} }for(int i = empire;i < 2*n-1; i++)

}int main()

諸侯安置(暴力搜尋)

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

dp 洛谷P1240 諸侯安置

哇很好的一道題目誒 和那個八皇后很像的,但是八皇后是一年前做的題了 這個我們搜尋就算了,雖然用一些技巧也不是說過不去 我們dp吧 但是這個影象我們顯然是不可以dp的 那我們轉化一下 圖是從某大佬部落格上盜來的 因為是橫豎關係,所以平移一點影響都沒有 但是你平移成這樣,就可以dp了 f i,j f i...

諸侯安置 簡單的遞推

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