bzoj1037 DP 生日聚會party

2021-07-17 05:20:26 字數 1835 閱讀 7730

description

今天是hidadz小朋友的生日,她邀請了許多朋友來參加她的生日party。 hidadz帶著朋友們來到花園中,打算坐成一排玩遊戲。為了遊戲不至於無聊,就座的方案應滿足如下條件:對於任意連續的一段,男孩與女孩的數目之差不超過k。很快,小朋友便找到了一種方案坐了下來開始遊戲。hidadz的好朋友susie發現,這樣的就座方案其實是很多的,所以大家很快就找到了一種,那麼到底有多少種呢?熱愛數學的hidadz和她的朋友們開始思考這個問題 ……

假設參加party的人中共有n個男孩與m個女孩,你是否能解答susie和hidadz的疑問呢?由於這個數目可能很多,他們只想知道這個數目除以12345678的餘數。

input

僅包含一行共3個整數,分別為男孩數目n,女孩數目m,常數k。

output

應包含一行,為題中要求的答案。

sample input

1 2 1

sample output

hint

n , m ≤ 150,k ≤ 20。

題解

並非簡單的dp,不像平常那般用二維表示乙個狀態。這次而是要採用4維陣列來儲存。f[i][j][k][l]表示了:

當前總共i個人,有j個男生,在i個人中某一段交雜的男女生中男生減去女生的最大人數k,以及在i個人中某一段交雜的男女生中女生減去男生的最大人數l。

這樣狀態就能perfect的表達出來了。狀態轉移方程為:

f[i+1][j+1][k+1][max(l-1,0)]=(f[i+1][j+1][k+1][max(l-1,0)]+f[i][j][k][l])%mod

f[i+1][j][max(k-1,0)][l+1]=(f[i+1][j][max(k-1,0)][l+1]+f[i][j][k][l])%mod

最終答案就是:

for(j=0 to n)for(k=0 to n)for(l=0 to n)ans=max(f[n+m][j][k][l],ans)

並不簡單,參考了hzwer學長的部落格。望諒解

(黃學長部落格傳送門,比我寫的好很多:

**

#include

#include

#include

#include

using

namespace

std;

const

int mod=12345678;

int f[310][151][21][21];

int n,m,k,x,y;

int main()

if(y+1

<=k && i-j+1

<=m)//女生+1不大於最大值m,並且最大值+1不大於k

}int ans=0;

for(int i=0;i<=n;i++)

for(int x=0;x<=k;x++)

for(int y=0;y<=k;y++)

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

return

0;}

生日聚會 BZOJ 1037

生日聚會 問題描述 今天是hidadz小朋友的生日,她邀請了許多朋友來參加她的生日party。hidadz帶著朋友們來到花園中,打算坐成一排玩遊戲。為了遊戲不至於無聊,就座的方案應滿足如下條件 對於任意連續的一段,男孩與女孩的數目之差不超過k。很快,小朋友便找到了一種方案坐了下來開始遊戲。hidad...

bzoj 1037 生日聚會Party(DP)

傳送門biu 如果求乙個01序列滿足任意一段0和1的數量差不超過k,可以考慮在已滿足條件的某序列後面填一位0或1,只考慮當前序列的所有字尾是否滿足0和1數量差不超過k的條件。這樣我們就判斷了最終序列的所有字首的字尾是否滿足條件,即任意一段0和1的數量差是否超過k。令f i j x y 表示有i個男孩...

bzoj1037 ZJOI2008 生日聚會

bzoj1037 zjoi2008 生日聚會 題意 一排小孩坐著玩遊戲。就座的方案滿足如下條件 對於任意連續的一段,男孩與女孩的數目之差不超過k。給出男孩數,女孩數和k,求就座方案數除以12345678的餘數。題解 dp方程見程式,i1i2表示當前選了幾男幾女,i3i4分別表示當前男比女多幾個和女比...