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