USACO Feb09 牡牛和牝牛

2021-10-09 05:36:04 字數 1712 閱讀 3629

解決過程

感想約翰要帶n(1≤n≤100000)只牛去參加集會裡的展示活動,這些牛可以是牡牛,也可以是牝牛.牛們要站成一排.但是牡牛是好鬥的,為了避免牡牛鬧出亂子,約翰決定任意兩隻牡牛之間至少要有k(o≤k一行,輸入兩個整數n和k.

乙個整數,表示排隊的方法數.

4 2以下是6種可能的序列('b』代表牡牛,「c」代表牝牛):

cccc

bccc

cbcc

ccbc

cccb

bccb

這很明顯是一道動態規劃

我們設 f[i

][0]

f [ i ] [ 0 ]

f[i][0

] 表示當前位置 i 放牝牛的方案數

f [i

][0]

f [ i ] [ 0 ]

f[i][0

] 表示當前位置 i 放牡牛的方案數

如果當前位置放牝牛,它的上乙個位置既可以放牝牛又可以放牡牛,即

f [i

][0]

=f[i

−1][

0]+f

[i−1

][1]

f[i][0]=f[i-1][0]+f[i-1][1]

f[i][0

]=f[

i−1]

[0]+

f[i−

1][1

] 如果當前位置放牡牛,它的 i−1

i-1i−

1 位置到 i−k

i - k

i−k 的位置都沒有辦法放牡牛,但如果直接加上 f[i

−1][

0]

f[i-1][0]

f[i−1]

[0] 不能保證 i−2

i-2i−

2 到 i−k

i-ki−

k 沒有牡牛,一直到 f[i

−k][

0]

f[i-k][0]

f[i−k]

[0] 才能保證 i−1

i-1i−

1 到 i−k

i-ki−

k 沒有牡牛,即

f [i

][1]

=f[i

−k][

0]

f[i][1]=f[i-k][0]

f[i][1

]=f[

i−k]

[0]

接下來就可以敲**了

僅供參考

#include

#include

#include

using

namespace std;

const

int mod =

5000011

;const

int maxn =

100010

;int n,k;

int f[maxn][2

];//f[i][0]表示位置 i 放牡牛的方案數

int main (

) printf (

"%d\n"

,(f[n][1

]+ f[n][0

])% mod)

;return0;

}

動態規劃的題還是要靜下心來慢慢推,還是我太弱了 。

——2020.8.16

bzoj 3398 牡牛和牝牛

牝 pin 4聲 母的意思。牡 mu 3聲 公的意思。看到這些字我直接愣了,其實放在牝雞司晨和牡蠣這兩個詞裡我絕對能認出來。是不是該去頹語文了?這道題f i 表示最後乙個是公牛的方案數,sigma f j j問題是hzwer用了奇怪的排列組合。這道題可以用隔板法,設abcd是放公牛的位置,那麼a,b...

BZOJ3398 牡牛和牝牛

time limit 1 sec memory limit 128 mb submit 440 solved 301 約翰要帶n 1 n 100000 只牛去參加集會裡的展示活動,這些牛可以是牡牛,也可以是牝牛 牛們要站成一排 但是牡牛是好鬥的,為了避免牡牛鬧出亂子,約翰決定任意兩隻牡牛之間至少要有...

組合數學 牡牛和牝牛

約翰要帶 n 只牛去參加集會裡的展示活動,這些牛可以是牡牛,也可以是牝牛。牛們要站成一排,但是牡牛是好鬥的,為了避免牡牛鬧出亂子,約翰決定任意兩隻牡牛之間至少要有 k 只牝牛。請計算一共有多少種排隊的方法,所有牡牛可以看成是相同的,所有牝牛也一樣,答案對 5000011 取模。輸入格式 一行,輸入兩...