题解 | #跳台阶#

跳台阶

https://www.nowcoder.com/practice/bfb2a2b3cdbd4bd6bba0d4dca69aa3f0?tpId=230&tqId=2357966&ru=/exam/oj&qru=/ta/dynamic-programming/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D230

因为是 dp ,所以先来划分子问题:

假设跳 nn 个台阶的跳法总数为 fnf_n

那么 f1=1f_1=1 (跳 11 阶只有一种方法),f2=2f_2=2(跳 22 阶有两种方法:1 12 )。

尝试列出几个 nn

f1=1f_1=1

f2=2f_2=2

f3=3f_3=3

f4=5f_4=5

f5=8f_5=8 ……

在列举过程中,我们会发现,每次跳跃方法数只取决于第一次选择 11 还是 22

如果选择先跳 11 阶,就跟 n1n-1 阶时的跳跃方法数相同(这一跳消去了 11 阶),也就是 fn1f_{n-1}

如果选择先跳 22 阶,就跟 n2n-2 阶时的跳跃方法数相同(这一跳消去了 22 阶),也就是 fn2f_{n-2}

实际跳台阶时,既可以选先跳 11 阶,也可以选先跳 22 阶,所以总跳法数是 fn1+fn2f_{n-1}+f_{n-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;
}
全部评论

相关推荐

点赞 评论 收藏
分享
程序员小白条:你不是有一段实习了吗,现在找中大厂实习?过段时间要秋招了
我的简历长这样
点赞 评论 收藏
分享
06-15 02:05
已编辑
南昌航空大学 数据分析师
Eason三木:你如果想干技术岗,那几个发公众号合唱比赛的经历就去掉,优秀团员去掉,求职没用。然后CET4这种不是奖项,是技能,放到下面的专业技能里或者单独列一个英语能力。 另外好好改改你的排版,首行缩进完全没有必要,行间距好好调调,别让字和标题背景黏在一起,你下面说能做高质量PPT你得展现出来啊,你这简历排版我用PPT做的都能比你做的好。 然后自我评价,你如果要干数据工程师,抗压能力强最起码得有吧。
简历中的项目经历要怎么写
点赞 评论 收藏
分享
05-11 20:45
门头沟学院 Java
有担当的灰太狼又在摸...:零帧起手查看图片
点赞 评论 收藏
分享
评论
4
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务