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,ik1]的求和
我们用 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(ik1,0)]s[i]=s[i1]+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牡牛和牝牛的主要内容,如果未能解决你的问题,请参考以下文章

BZOJ 3398 牡牛和牝牛

1652:牡牛和牝牛

Bullcow 牡牛和牝牛(bzoj 3398)

bzoj3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛(排列组合)

bzoj3398 / [Usaco2009 Feb]Bullcow 牡牛和牝牛

牡牛和牝牛