DP牡牛和牝牛
Posted 行码棋
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DP牡牛和牝牛相关的知识,希望对你有一定的参考价值。
- 博客主页: https://blog.csdn.net/qq_50285142
- 欢迎点赞👍收藏✨关注❤留言 📝 如有错误,敬请指正
- 🎈虽然生活很难,但我们也要一直走下去🎈
题目描述
约翰要带 N 只牛去参加集会里的展示活动,这些牛可以是牡牛,也可以是牝牛。牛们要站成一排,但是牡牛是好斗的,为了避免牡牛闹出乱子,约翰决定任意两只牡牛之间至少要有 K 只牝牛。
请计算一共有多少种排队的方法,所有牡牛可以看成是相同的,所有牝牛也一样,答案对 5000011 取模。
简化一下题目,其实就是
N头牛,要求两个公牛之间至少有K头母牛,求总的排列方案
题目思路
f
[
i
]
f[i]
f[i]代表第i
个位置为公牛的总的方案数,既然第i
个位置已经放置公牛了,那么前面的k
个位置不能放公牛,那么求
f
[
i
]
f[i]
f[i]的时候,就要求与第i
个位置相隔k
个位置的总的方案数,也就是前面的与i
位置相隔大于等于k
的位置放置公牛还是母牛是任意的,我们求这些的方案数,那么就需要求
[
1
,
i
−
k
−
1
]
[1,i-k-1]
[1,i−k−1]的求和
我们用
s
[
i
]
s[i]
s[i]表示
f
[
i
]
f[i]
f[i]的前缀和
那么
f
[
i
]
=
s
[
m
a
x
(
i
−
k
−
1
,
0
)
]
s
[
i
]
=
s
[
i
−
1
]
+
f
[
i
]
f[i] = s[max(i-k-1,0)] \\\\ s[i] = s[i-1]+f[i]
f[i]=s[max(i−k−1,0)]s[i]=s[i−1]+f[i]
代码
#include<bits/stdc++.h>
using namespace std;
const int mod = 5000011,N = 1e5+5;
int f[N],s[N];
int main()
int n,k;
scanf("%d%d",&n,&k);
f[0] = s[0] = 1;
for(int i=1;i<=n;i++)
f[i] = s[max(i-k-1,0)];
s[i] = (s[i-1] + f[i])%mod;
printf("%d\\n",s[n]);
return 0;
往期优质文章推荐
以上是关于DP牡牛和牝牛的主要内容,如果未能解决你的问题,请参考以下文章
bzoj3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合)