【基础算法】第一章 递推算法
例一 错排问题

很简单的递推
| 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; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】