来源:1307. 牡牛和牝牛
#include <iostream>
using namespace std;
const int N = 1e5 + 7, mod = 5000011;
int f[N];
int main() {
int n, k;
cin >> n >> k;
for (int i = 1; i <= k + 1; i ++) {
f[i] = i + 1;
}
for (int i = k + 2; i <= n; i ++) {
f[i] = (f[i - 1] + f[i - k - 1]) % mod;
}
cout << f[n] << endl;
return 0;
}
DP 三部曲
状态表示:f[i]表示符合题目要求的 i 头牛的排列方式
状态计算:根据第 i 头牛是”0”还是”1”去划分
边界设置:设置f[0] = 1后,f[1]~f[n]都能被计算出
#include <iostream>
using namespace std;
const int N = 1e5 + 7, mod = 5000011;
int f[N];
int main() {
int n, k;
cin >> n >> k;
f[0] = 1;
for (int i = 1; i <= n; i ++) {
f[i] += f[i - 1];
if (i >= k + 1) f[i] += f[i - k - 1];
else f[i] += 1;
f[i] = f[i] % mod;
}
cout << f[n] << endl;
return 0;
}
这里是如何计算相邻两个1之间0的个数的?
老哥,i头牛的时候 为啥最多只有1个1, 也就是初始化的时候f[i] = i + 1, 这一步是咱们默认的他就有一个1吗,再说i = 1的时候 f[1] = 2 这又是什么意思,‘0’或‘1’ 吗,然后之后的全是默认一个牧牛 一个1 ?? 不明白啊
i <= k + 1时,你放两个‘1’,无论怎么放都不满足条件啊,所以最多放 1 个‘1’。而不放‘1’有 1 种方案,放一个‘1’有 i 个位置可以放,所以是 i 种方案,总共 i + 1 种