Jzoj 递推算法部分题目(共7题)

2790: 菲波那契数列

//斐波那契数列问题
#include <bits/stdc++.h>
using namespace std;
int n, a, ans[1000010];
int main()
{
	ans[1]=1;
	ans[2]=1;
	for(int i=3; i<=1000000; ++i){
		ans[i]=(ans[i-1]+ans[i-2])%1000;
	}
	scanf("%d", &n);
	while(n--){
		scanf("%d", &a);
		printf("%d\n", ans[a]);
	}
	return 0;
}

1159: 【基础】爬楼梯

//斐波那契数列问题, 爬楼梯问题
#include <bits/stdc++.h>
using namespace std;
int n;
long long ans[210];
int main()
{
	scanf("%d", &n);
	ans[1]=1;
	ans[2]=2;
	for(int i=3; i<=n; ++i){
		ans[i]=ans[i-1]+ans[i-2];
	}
	printf("%lld", ans[n]);
	return 0;
}

2723: 【基础】取糖果

这是一道高精度斐波那契数列的题目

低精度部分分做法,60%AC

//斐波那契数列问题, 爬楼梯问题
#include <bits/stdc++.h>
using namespace std;
int n;
long long ans[210];
int main()
{
	scanf("%d", &n);
	ans[1]=1;
	ans[2]=2;
	for(int i=3; i<=n; ++i){
		ans[i]=ans[i-1]+ans[i-2];
	}
	printf("%lld", ans[n]);
	return 0;
}

高精度AC代码

#include <bits/stdc++.h>
using namespace std;
int n;
struct node
{
	int len=0;
	int num[2000]={0};	
}ans[210];
node operator + (node x, node y)
{
	node sum;
	sum.len=max(x.len, y.len);
	for(int i=1; i<=sum.len; ++i){
		sum.num[i]+=x.num[i]+y.num[i];
		sum.num[i+1]+=sum.num[i]/10;
		sum.num[i]%=10;
	}
	if(sum.num[sum.len+1]){
		sum.len++;
	}
	return sum;
}
int main()
{
	scanf("%d", &n);
	ans[1].len=1;
	ans[1].num[1]=1;
	ans[2].len=1;
	ans[2].num[1]=2;
	for(int i=3; i<=n; ++i){
		ans[i]=ans[i-1]+ans[i-2];
	}
	for(int i=ans[n].len; i>=1; --i){
		printf("%d", ans[n].num[i]);
	}
	return 0;
}

2789: 【基础】过河卒简版

1162: 【NOIP02普及组】过河卒

2792: 【基础】Hanoi塔问题

递推

#include <bits/stdc++.h>
using namespace std;
int n, ans[31];
int main()
{
	scanf("%d", &n);
	ans[1]=1;
	for(int i=2; i<=n; ++i){
		ans[i]=2*ans[i-1]+1;
	}
	printf("%d", ans[n]);
	return 0;
}

2^n-1步

#include <bits/stdc++.h>
using namespace std;
int n, ans;
int main()
{
	scanf("%d", &n);
	ans=pow(2, n)-1;
	printf("%d", ans);
	return 0;
}

2793: 【基础】流感传染

猜你喜欢

转载自blog.csdn.net/u013313909/article/details/127237981