2024.7.21学习笔记

目录

递推

1.递推思想

2.fib数列的递推

3.圆中画线

4.n条折线求区域

5.在2*n的长方形方格中求方案数

6.合法队列

7.涂色

8.卡特兰数

1.连线的方案


递推

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值