【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 @   su-yichen  阅读(69)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示