题解 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;
}