【ybtoj】递推算法例题

【基础算法】第一章 递推算法

例一 错排问题


很简单的递推

 a[i]=(i-1)*(a[i-2]+a[i-1]);

Code

#include <bits/stdc++.h>
using namespace std;
int main(){
	int n;
	long long a[10000];
	cin>>n;
	a[1]=0;a[2]=1;
	for(int i=3;i<=n;i++){
		a[i]=(i-1)*(a[i-2]+a[i-1]);
		
	}
	cout<<a[n];
} 

例二 数的划分


虽说是递推,但这里我用到了一个搜索

Code

#include <bits/stdc++.h>
using namespace std;
int a[205];
int n,k;
int ans=0;
void dfs(int a,int sum,int c){
	if(c==k){
		if(sum==n) ans++;
		return;
}
    
	for(int i=a;sum+i*(k-c)<=n;i++){				
		dfs(i,sum+i,c+1);	
	}
}
int main(){
	cin>>n>>k;
	dfs(1,0,0);
	cout<<ans;
} 

例三 传球游戏

此题关键点在于

  j=1时 f[i][j]=f[i-1][n]+f[i-1][2];
  j=n时 f[i][j]=f[i-1][1]+f[i-1][n-1];
  其余时候 f[i][j]=f[i-1][j-1]+f[i-1][j+1];

Code

#include <bits/stdc++.h>
using namespace std;
int main(){
	int n;
	int m;
	int f[100][100];
	cin>>n>>m;
	f[0][1]=1;
	for(int i=1;i<=m;i++){
		for(int j=1;j<=n;j++){
			if(j==1){
				f[i][j]=f[i-1][n]+f[i-1][2];
				
			}
			else if(j==n){
				f[i][j]=f[i-1][1]+f[i-1][n-1];
			}
			else f[i][j]=f[i-1][j-1]+f[i-1][j+1];
		}
	}
	cout<<f[m][1];
	return 0; 
}

例四 栈的问题


一看到栈,本以为会深度一些,包括一些头尾等等,但是也是用一个递推式就可以解决

Code

#include<bits/stdc++.h>
using namespace std;
int f[100];
int main(){
	int n;
	cin>>n;
	f[0]=1;
	f[1]=1;
	for(int i=2;i<=n;i++){
		for(int j=0;j<i;j++){
			f[i]+=f[j]*f[i-j-1];
		}
	}
	cout<<f[n];
	return 0;
} 
posted @ 2022-02-17 15:14  su-yichen  阅读(54)  评论(0编辑  收藏  举报