因为是 dp
,所以先来划分子问题:
假设跳 个台阶的跳法总数为 ,
那么 (跳 阶只有一种方法),(跳 阶有两种方法:1 1
和 2
)。
尝试列出几个 :
;
;
;
;
……
在列举过程中,我们会发现,每次跳跃方法数只取决于第一次选择 还是 :
如果选择先跳 阶,就跟 阶时的跳跃方法数相同(这一跳消去了 阶),也就是 ;
如果选择先跳 阶,就跟 阶时的跳跃方法数相同(这一跳消去了 阶),也就是 。
实际跳台阶时,既可以选先跳 阶,也可以选先跳 阶,所以总跳法数是 。
得到了状态转移方程,就可以着手写程序了:
#include <bits/stdc++.h>
using namespace std;
long long a[50]; // 开 long long 防止溢出
int main(){
int n; // 目标阶数
cin>>n;
a[1]=1; // 1 阶 1 种方法
a[2]=2; // 2 阶 2 种方法
for(int i=3;i<=n;i++){
a[i]=a[i-1]+a[i-2]; // 状态转移
}
cout<<a[n]; // 输出
return 0;
}
也可以选择递归:
#include <bits/stdc++.h>
using namespace std;
long long a[50];
long long s(int n){
if(n==1||n==2){
return n;
}else{
return s(n-2)+s(n-1); // 状态转移 & 递归
}
}
int main(){
int n;
cin>>n;
cout<<s(n);
return 0;
}