题解 | #跳台阶#

跳台阶

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;
}
全部评论

相关推荐

4 收藏 评论
分享
正在热议
# 牛客帮帮团来啦!有问必答 #
1152788次浏览 17156人参与
# 通信和硬件还有转码的必要吗 #
11237次浏览 101人参与
# 不去互联网可以去金融科技 #
20700次浏览 258人参与
# 和牛牛一起刷题打卡 #
19098次浏览 1635人参与
# 实习与准备秋招该如何平衡 #
203508次浏览 3628人参与
# 大厂无回复,继续等待还是奔赴小厂 #
5003次浏览 32人参与
# OPPO开奖 #
19312次浏览 268人参与
# 通信硬件薪资爆料 #
266050次浏览 2484人参与
# 国企是理工四大天坑的最好选择吗 #
2236次浏览 34人参与
# 互联网公司评价 #
97739次浏览 1280人参与
# 简历无回复,你会继续海投还是优化再投? #
25041次浏览 354人参与
# 0offer是寒冬太冷还是我太菜 #
454973次浏览 5125人参与
# 国企和大厂硬件兄弟怎么选? #
53926次浏览 1013人参与
# 参加过提前批的机械人,你们还参加秋招么 #
14648次浏览 349人参与
# 硬件人的简历怎么写 #
82298次浏览 852人参与
# 面试被问第一学历差时该怎么回答 #
19413次浏览 213人参与
# 你见过最离谱的招聘要求是什么? #
28499次浏览 248人参与
# 学历对求职的影响 #
161281次浏览 1804人参与
# 你收到了团子的OC了吗 #
538878次浏览 6389人参与
# 你已经投递多少份简历了 #
344334次浏览 4963人参与
# 实习生应该准时下班吗 #
97016次浏览 722人参与
# 听劝,我这个简历该怎么改? #
63530次浏览 622人参与
牛客网
牛客企业服务