目录
递推
1.递推思想
/*已知第一个人m岁,第二个人比第一个人大x岁,依次类推求第n个人多少岁*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int a[MAX];
int di_tui(int n,int m,int x){
a[0]=m;
for(int i=1;i<n;i++){
a[i]=a[i-1]+x;
}
return a[n-1];
}
void _slove(){
int n,m,x;
cin>>n>>m>>x;
cout<<di_tui(n,m,x)<<endl;
}
int main(){
_slove();
return 0;
}
2.fib数列的递推
/*fib数列*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int fib[MAX];
int DT_fib(int n){
fib[0]=1,fib[1]=1;
for(int i=2;i<n;i++){
fib[i]=fib[i-1]+fib[i-2];
}
return fib[n-1];
}
void _slove(){
int n;
cin>>n;
cout<<DT_fib(n)<<endl;
}
int main(){
_slove();
return 0;
}
3.圆中画线
/*在一个圆里画n条线,n条线相交有n-1个交点,求n条线能划分多少区域*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int f[MAX];
int _ditui(int n){
f[1]=2;
for(int i=2;i<=n;i++){
f[i]=f[i-1]+i;
}
return f[n];
}
int _Gs(int n){
if(n%2==0) return ((n/2)*(n+1)+1);
else return ((n+1)/2*n+1);
}
void _slove(){
int n;
cin>>n;
cout<<"递推法:"<<_ditui(n)<<endl;
cout<<"公式法:"<<_Gs(n)<<endl;
}
int main(){
_slove();
return 0;
}
4.n条折线求区域
/*画n条折线,求n条折线最多能划分多少区域*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int a[MAX];
int _ditui(int n){
a[1]=2;
for(int i=2;i<=n;i++){//4*(i-1)为最多相交的点数
a[i]=a[i-1]+(4*(i-1)+1);
}
return a[n];
}
void _slove(){
int n;
cin>>n;
cout<<_ditui(n)<<endl;
}
int main(){
_slove();
return 0;
}
5.在2*n的长方形方格中求方案数
/*在2*n的长方形中,用n个1*2的骨牌铺满,列如n=3时,
为2*3的长方形,此时骨牌铺满的方案有三种,输入n,输出
铺放方案的总数*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int a[MAX];
int _ditui(int n){
a[1]=1,a[2]=2;
for(int i=3;i<=n;i++){
a[i]=a[i-1]+a[i-2];
}
return a[n];
}
void _slove(){
int n;
cin>>n;
cout<<_ditui(n)<<endl;
}
int main(){
_slove();
return 0;
}
6.合法队列
/*X学校有很多学生。有一天,校长希望所有学生站成一排,
并且规定女孩不能单独站。比如,n=4时,有以下7种可能的
合法队列(F女,M男):FFFF、FFFM、MFFF、FFMM、MFFM、MMFF、MMMM
给定人数n,求所有可能的n个人的合法队列数*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int a[MAX];
int _ditui(int n){
a[1]=1,a[2]=2,a[3]=4,a[4]=7;
for(int i=5;i<=n;i++){
a[i]=a[i-1]+a[i-2]+a[i-4];
}
return a[n];
}
void _slove(){
int n;
cin>>n;
cout<<_ditui(n)<<endl;
}
int main(){
_slove();
return 0;
}
7.涂色
/*有排成一行的n个方格,用红(Red),粉(Pink)、
绿(Green)三色涂每个格子,每格涂一色,要求任
何相邻的方格不能同色,且首尾两格也不同色,
求全部的满足要求的涂法。*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int a[MAX];
int _ditui(int n){
a[1]=3,a[2]=6;
for(int i=3;i<=n;i++){
a[i]=a[i-1]+2*a[i-2];
}
return a[n];
}
void _slove(){
int n;
cin>>n;
cout<<_ditui(n)<<endl;
}
int main(){
_slove();
return 0;
}
8.卡特兰数
1.连线的方案
/*2*n个数字按顺时针方向围成一个圆,n条线段把所有的数
两两相连,要求线段不能有交叉。求:一共有多少种不同的
连线方案*/
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
long long int a[MAX];
double c[MAX];
int KTL_ditui(int n){
a[1]=1;
for(int i=2;i<=n;i++){
a[i]=(4*i-2)*a[i-1]/(i+1);
}
return a[n];
}
void _slove(){
int n;
cin>>n;
cout<<KTL_ditui(n)<<endl;
}
int main(){
_slove();
return 0;
}