题解 P6191 【[USACO09FEB]Bulls And Cows S】

Bulls And Cows题解

ello 我们来看下这道题

看到这道题,一般不是很容易想到dp,尤其是初学者。

因为dp在初学者(起码是我)印象中是专门处理最优解问题的。

但是,dp其实还可以处理一下问题:

  • 最优解
  • 总和
  • 判断对错
  • ....

题目分析

既然提到了dp,那么我们就开始顺着dp的方向想。

首先,我们需要考虑第一步选择是啥。

如何考虑这个问题?

  • 其实这道题你可以考虑最后一个位置(或者第一个位置)放奶牛还是公牛

这就是我们的第一步选择。

做出第一步选择后,我们可以发现这个问题就转化成了一个几乎同样的子问题。

为什么?

我们分两种情况讨论:

  • 第一种,如果要是最后一个位置(或者第一个位置)放的是奶牛,那么,我们就直接考虑第n-1个位置是公牛还是母牛,因为在第n个位置放奶牛并不影响前面的任何一个位置。
  • 第二种,如果要是最后一个位置(或者第一个位置)放的是公牛,那么,我们第n-k-1个位置放公牛还是母牛,因为在第n个位置放公牛就代表着n~n-k之间的位置已经固定了。

综上,最后的\(dp[i]\)其实就是\(dp[i-1]+dp[i-k-1]\)

最后,还有一个问题,初始化。

我们如何考虑?

首先,我们需要知道什么东西需要初始化。

  • dp[0~k]
  • 因为他们之间是不可能有>2头公牛的。

其次,要考虑初始值。

  • dp[i]=i+1

好!那现在你们应该会写了吧...

对了,别忘了取模

关键代码:

	for(int i=0;i<=k;i++)
	{
		dp[i]=i+1; 
	}
	for(int i=k+1;i<=n;i++)
	{
		dp[i]+=dp[i-1]+dp[i-k-1];
		dp[i]%=5000011;
	}
posted @ 2021-12-15 22:05  zplqwq  阅读(58)  评论(0编辑  收藏  举报