0
点赞
收藏
分享

微信扫一扫

2022蓝桥杯——积木画

奋斗De奶爸 2022-04-14 阅读 60
蓝桥杯c++

前言

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

成功运行!
在这里插入图片描述

总结

由于以前从未了解过编程规范和一些很基础的算法,每次都是现学现卖的那种,后来看到一篇经验贴说的很对!大致意思
不要指望着在考场上自己能够创造出一种解题算法,要见多才能够识广!
所以现在要慢慢了解知识,一步一个脚印!!!

举报

相关推荐

0 条评论