题解 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[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; }
本文作者:zplqwq
本文链接:https://www.cnblogs.com/zplqwq/p/15695554.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步