标签:1307 const int namespace 牝牛 include 100010 AcWing mod
一、算法分析
- 初始化:
f[0] = 1
(f[0]
表示不摆放1
的情况,初始值这么设,能让整个递推过程的边界是正确的则可行) - 结果:
f[0] + f[1] + f[2] + ... + f[n]
通过s[i]
记录f[0] + ... + f[i]
的前缀和可以优化到\(O(n)\)
二、朴素版本
#include <bits/stdc++.h>
using namespace std;
const int N = 100010, mod = 5000011;
int n, k;
int f[N];
// PASS 8/12 其它的TLE,需要优化
int main() {
cin >> n >> k;
f[0] = 1; //表示没有公牛
for (int i = 1; i <= n; i++) {
if (i - k - 1 < 0)
f[i] = 1; //如果是前几个,不足k个的时候,其实每个位置,
//都是可能做为公牛位的,但是,只有一种可能,就是它是公牛位,它前面都不是公牛位
else {
//当位置超过了 i-k-1(看图),如果当前位是公牛位,那么前一个公牛位就需要枚举每个可能的位置了
for (int j = 0; j <= i - k - 1; j++) f[i] = (f[i] + f[j]) % mod;
}
}
int res = 0;
for (int i = 0; i <= n; i++) res = (res + f[i]) % mod;
printf("%d\n", res);
return 0;
}
三、递推版本I
#include <bits/stdc++.h>
using namespace std;
const int N = 100010, mod = 5000011;
int n, k;
int f[N], s[N];
int main() {
cin >> n >> k;
f[0] = s[0] = 1;
for (int i = 1; i <= n; i++) {
if (i - k - 1 > 0)
f[i] = s[i - k - 1]; //利用前缀和优化
else
f[i] = 1;
s[i] = (s[i - 1] + f[i]) % mod; //维护前缀和
}
cout << s[n] << endl;
return 0;
}
四、递推优化版本
#include <bits/stdc++.h>
using namespace std;
const int N = 100010, mod = 5000011;
int n, k;
int f[N], s[N];
int main() {
cin >> 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; //维护前缀和
}
cout << s[n] << endl;
return 0;
}
标签:1307,const,int,namespace,牝牛,include,100010,AcWing,mod 来源: https://www.cnblogs.com/littlehb/p/16348859.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。