递推例题

递推就是通过观察每一步的操作和前面步骤的联系得出递推式

上台阶

题意:楼梯有 n 级台阶,上楼时可以一步上 1 阶,也可以一步上 2 阶,也可以一步上 3 阶,编程计算共有多少种不同的走法。

思路:设a[i]为到第i层台阶需要走的步数,那么能到第i阶就只有三个路径:、
1.到第i-1阶,然后走一阶就到了
2.到第i-2阶,然后走两阶就到了
3.到第i-3阶,然后走三阶就到了

那么到到第i阶的步数就是:到第i-1阶的步数+到第i-2阶的步数+到第i-3阶的步数
即a[i]=a[i-1]+a[i-2]+a[i-3]

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
int n,k;
ll a[N];
int main(){
	int t;
	cin>>t;
	a[0]=1;
	a[1]=1;
	a[2]=2;
	for(int i=3;i<=200;i++)a[i]=a[i-1]+a[i-2]+a[i-3];
	while(t--){
		int x;
		cin>>x;
		cout<<a[x]<<endl;
	}
	return 0;
}

n个圆能将平面分成几部分

一个圆:2部分
两个圆:4部分
三个圆:8部分
在这里插入图片描述

那么每一步如果想尽可能的多分,就和每个存在的圆有交点
那么到四个圆的时候,我们想和已经存在的三个圆都有交点,就和每个圆有两个交点

在这里插入图片描述
那么就有6个交点,六个点分成了6个圆弧,每个圆弧将原来的部分一分为二,所以多出来了六部分

那么5个圆同理,和4个圆有8个交点,分成8个圆弧,每个圆弧将原来的部分一分为二,又多出来了8部分…

那么对于n个圆,就是多出来了2*(n-1)个部分

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
int n,k;
ll a[N];
int main(){
	int t;
	cin>>t;
	a[1]=2;
	a[2]=4;
	a[3]=8;
	for(int i=4;i<=10000;i++){
		a[i]=a[i-1]+2*(i-1);
	}
	while(t--){
		int x;
		cin>>x;
		cout<<a[x]<<endl;
	}
	return 0;
}

n个三角形能将平面分成几个部分

1个三角形:2部分

那么再加一个三角形的话,就想和已经存在的一个三角形有最多的交点

那么对于三角形的每条边都有两个交点,那么三条边就有6个交点

6个交点将线段分为6部分,那么对于每部分都一分为2,那么就多出来了6部分
在这里插入图片描述
以此类推,n个三角形就多出了6*(n-1)部分

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
typedef long long ll;
int n,k;
ll a[N];
int main(){
	int t;
	cin>>t;
	a[1]=2;
	for(int i=2;i<=10000;i++){
		a[i]=a[i-1]+6*(i-1);
	}
	while(t--){
		int x;
		cin>>x;
		cout<<a[x]<<endl;
	}
	return 0;
}

涂色

现在有排成一行的 n个方格,用红、粉、绿三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色。求共有多少种满足要求的涂法

n=1时方法数为3
n=2时方法数为6
n=3时方法数为6

当n>=4时,对于第i个方格:
如果第i-1个方格与第一个方格的颜色不一样,那么第i个方格就只能放一种颜色,设i-1个格子的方法数为f(i-1),那么第i个方格放一种颜色的方法数就为f(i-1)

如果第i-1个方格和第一个方格一样,那么第i个方格就可以放两种颜色,第i-2个方格肯定和第i-1个方格颜色不一样,假设设i-2个格子的方法数为f(i-2),那么第i个格子放两种颜色的方法数就为2*f(i-2)

总的方法数为f(i-1)+2*f(i-2)

#include<bits/stdc++.h>
using namespace std;
int n;
long long a[3005];
int main(){
	cin>>n;
	a[1]=3;
	a[2]=6;
	a[3]=6;
	if(n<=3){
		cout<<a[n];
		return 0;
	}
	for(int i=4;i<=n;i++)a[i]=a[i-1]+a[i-2]*2;
	cout<<a[n];
	return 0;
}
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值