前言
2022届蓝桥杯捐款300rmb,决定痛定思痛,好好学习,天天向上!2023届蓝桥杯争取不留遗憾!!!
首先,列举出几个简单的
然后慢慢思考,将N=n的问题,能否转化为N=n-1的问题呢?
那么这个积木的问题就变为了
利用递归的思想编写代码如下(显然会报错。。。因为递归算法就是舒服了自己,累死了计算机)
#include<iostream>
#include<math.h>
using namespace std;
int f(long long n)
{
if(n==0)
return 1;
if(n==1)
return 1;
if(n==2)
return 2;
if(n==3)
return 5;
return f(n-1)+f(n-2)+2*f(n-3)+2*f(n-4);
}
int main()
{
long long n;
cin >>n;
cout << fmod(f(n),1000000007);
return 0;
}
输入50000就输出不出来了
再将递归直接转换成一个for循环搞定
#include<iostream>
#include<math.h>
using namespace std;
int main()
{
int n;
cin >> n;
long long f[n];
f[0]=1;
f[1]=1;
f[2]=2;
f[3]=5;
for(int i=4; i<=n ; i++)
{
f[i] = fmod((f[i-1] + 2*f[i-2] + 2*f[i-4]),100000007);
}
cout << f[n];
return 0;
}
然后很好!!!又出不来结果。。。
感慨:哀吾生之须臾,羡长江之无穷!!!!
将局部变量f[n]定义到全局变量中就ok了,因为全局变量时存放再静态存储区,局部变量是存放在堆栈,上段代码中局部变量f[n]堆栈可能没有足够的存储空间!!!
#include<iostream>
#include<math.h>
using namespace std;
#define max 10000000
long long f[max];
int main()
{
int n;
cin >> n;
f[0]=1;
f[1]=1;
f[2]=2;
f[3]=5;
for(int i=4; i<=n ; i++)
{
f[i] = fmod((f[i-1] + 2*f[i-2] + 2*f[i-4]),100000007);
}
cout << f[n];
return 0;
}
自以为okl,结果还没完,我发现网上有个答案好像跟我不一样
这个小人说的话过度真实了,哈哈哈哈哈
原来是我老眼昏花,少了一个0
#include<math.h>
using namespace std;
#define max 10000000
long long f[max];
int main()
{
int n;
cin >> n;
f[0]=1;
f[1]=1;
f[2]=2;
f[3]=5;
for(int i=4; i<=n ; i++)
{
f[i] = fmod((f[i-1] + f[i-2] + 2*f[i-3] + 2*f[i-4]),1000000007);
}
cout << f[n];
return 0;
}
成功运行!
总结
由于以前从未了解过编程规范和一些很基础的算法,每次都是现学现卖的那种,后来看到一篇经验贴说的很对!大致意思
不要指望着在考场上自己能够创造出一种解题算法,要见多才能够识广!
所以现在要慢慢了解知识,一步一个脚印!!!