AcWing 821跳台阶
Version 1——斐波那契数列
#include<iostream>
using namespace std;
int fib(int x){
if(x==1) return 1;
if(x==2) return 2;
return fib(x-1)+fib(x-2);
}
int main(){
int n;
cin>>n;
cout<<fib(n)<<endl;
return 0;
}
Version 2——DP(其实跟version1差不多~)
#include<iostream>
using namespace std;
int dp[20];
int main(){
int n;
cin>>n;
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n;i++)
dp[i]=dp[i-1]+dp[i-2];
cout<<dp[n]<<endl;
return 0;
}
Version 3——记忆化搜索(数组记录)
可降低时间复杂度:从O(2^n)优化为O(n)
#include<iostream>
using namespace std;
int a[20]; // 记忆数组
int fib(int x){
if(a[x]) return a[x];
if(x==1) return 1;
if(x==2) return 2;
a[x]=fib(x-1)+fib(x-2);
return a[x];
}
int main(){
int n;
cin>>n;
cout<<fib(n)<<endl;
return 0;
}
AcWing 92——递归实现指数型枚举
#include<iostream>
using namespace std;
int st[20]; //1:选;2:不选
int n;
void dfs(int k){ //第k个数
if(k==n+1){
for(int i=1;i<=n;i++){
if(st[i]==1)
cout<<i<<" ";
}
cout<<endl;
return;
}
// 选
st[k]=1;
dfs(k+1);
st[k]=0;// 可要可不要
// 不选
st[k]=2;
dfs(k+1);
st[k]=0;// 可要可不要
}
int main(){
cin>>n;
dfs(1);
return 0;
}
AcWing 94——递归实现排列型枚举
#include<iostream>
using namespace std;
int a[10],st[10];
int n;
void dfs(int k){
if(k==n+1){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return;
}
for(int i=1;i<=n;i++){
if(!st[i]){
st[i]=1;
a[k]=i;
dfs(k+1);
st[i]=0;
a[k]=0;
}
}
}
int main(){
cin>>n;
dfs(1);
return 0;
}
AcWing 93——递归实现组合型枚举
#include<iostream>
using namespace std;
int n,m;
int a[15]; // 组合型不用开flag(开了也不错)
void dfs(int k,int start){
if(m-k>n-start) // 剪枝优化(优化后能节省一半时间)
return;
if(k==m+1){
for(int i=1;i<=m;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}
for(int i=start;i<=n;i++){
a[k]=i;
dfs(k+1,i+1);
a[k]=0;
}
}
int main(){
cin>>n>>m;
dfs(1,1);
return 0;
}
ps:
markdown编辑排版挺好用哇~