dp 洛谷P1240 諸侯安置

2021-08-01 21:08:11 字數 1134 閱讀 2849

哇很好的一道題目誒;

和那個八皇后很像的,但是八皇后是一年前做的題了;

這個我們搜尋就算了,雖然用一些技巧也不是說過不去;

我們dp吧;

但是這個影象我們顯然是不可以dp的;

那我們轉化一下;

圖是從某大佬部落格上盜來的…….

因為是橫豎關係,所以平移一點影響都沒有;

但是你平移成這樣,就可以dp了;

f[i,j]:=f[i,j]+f[k,j-1]*(len[i]-(j-1)) [j-1<=k<=i-1]

方程說明:

1.f[i,j]表示前i列放置j個的方案,且第j個放在第i列上,

2.前面f[k,j-1]個都需要累加上來,舉乙個說明為什麼需要累加:對於前4排放置2個的情況(平移後的),2個即可以放在第一列和第三列,也可以放在第一列和第四列,所以需要把這些分布在不同列的情況累加上來。

3.乘(len[i]-(j-1))是因為前面k列放了j-1個棋子了,然後每行只能放乙個棋子,所以第j個棋子在第i列可以放的情況就是len[i]-(j-1),len[i]是第i列有多少行,程式中是l[i]

#include

using namespace std;

int f[1000][1000];

int l[1000],top;

int n,m,ans;

int main()

l[1]=l[2]=1;top=2;

while(l[top]*2-1)

top--;

f[0][0]=1;

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

for(int j=1;j<=min(m,l[i]);j++)

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

f[i][j]=(f[i][j]+f[k][j-1]*(l[i]-j+1))%504;

for(int i=1;i<=top;i++)ans=(ans+f[i][m])%504;

printf("%d",ans);

}

洛谷 P1240 諸侯安置

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

洛谷P1240 諸侯安置 遞推

題目大意 有一片正方形狀 旋轉45 看 的國土,有m個諸侯需要安置。諸侯在同一行或同一列上會互相傷害0.0,求出合理安置諸侯 使諸侯兩兩之間都不能攻擊 的方案數對504取模的結果。n 100,k 2n2 2n 1 這張圖中上面第一幅圖為n 3的國土分布。下面前兩幅圖中兩個諸侯會互相攻擊,而第三幅圖不...

洛谷P1052 過河 dp

題目大意 獨木橋長度l,橋上有m個石頭,要過橋,起點0,只要跳到或者跳過l都算過了,每次跳躍距離是s t之間的整數值,問跳過橋最少需要踩到的石子數 dp i 表示跳躍了距離i,最少需要踩到的石子數。stone i 表示在距離i有無石頭。狀態轉移方程 dp i min dp i dp i j ston...