递推就是通过观察每一步的操作和前面步骤的联系得出递推式
上台阶
题意:楼梯有 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;
}