解決過程
感想約翰要帶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 取模。輸入格式 一行,輸入兩...