作者语录:
1、 从不会做到会做的过程,从不理解到不理解的过程,从一个不会做这道题的人的角度出发看这个问题,好命苦嗷嗷嗷!
2、只有我受煎熬吗,偶买噶,,,
目录
[第一步:去做70. 爬楼梯 - 力扣(LeetCode)](#第一步:去做70. 爬楼梯 - 力扣(LeetCode))
研究高塔登顶方案,如果没有思路:
研究步骤:
第一步:去做70. 爬楼梯 - 力扣(LeetCode)
cpp/*假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶 提示: 1 <= n <= 45*/ #include<bits/stdc++.h> using namespace std; //爬n阶楼梯,返回 int cl(int n){ if(n==1)return 1; if(n==2)return 2; int pre=1,last=2; int sum=0; for(int i=3;i<=n;i++){ sum=pre+last; pre=last; last=sum; } return sum; } int main(){ int n;cin>>n; cout<<cl(n)<<'\n'; return 0; }
第二步:使用斐波那契数列的思路暴力 高塔登顶方案
cpp#include <iostream> using namespace std; #define int long long const int mod=1e9+7; const int N=1e5+10; int f[N]; signed main() { // 请在此输入您的代码 int n,m,k; cin>>n>>m>>k; //求方案数 f[1]=1;//f[x]里面存的是x的是到x层的方案数 for(int i=2;i<=n;i++){ //想成是类斐波那契数列:这个数的值=前n个数的和,这里的n就是从i-m到i-k for(int j=m;j<=k;j++){ f[i]=f[i]+f[i-j]; f[i]=f[i]%mod; } } cout<<f[n]<<'\n'; return 0; }
第三步:使用前缀和优化
这里前缀和,用prefix[N] 存放,prefix 是f 的前缀和,前缀和常用来计算区间l到区间r范围的和。
**参考前缀和的话:**前缀和
cpp#include <bits/stdc++.h> using namespace std; #define int long long const int m=1e9+7; const int N=1e5+10; int f[N],prefix[N]; signed main() { // 请在此输入您的代码 int n,m,k; cin>>n>>m>>k; //求方案数 f[1]=1; prefix[1]=1;//f[x]里面存的是x的是到x层的方案数 int l,r; int a=0; for(int i=2;i<=n;i++){ /*for(int j=m;j<=k;j++){ f[i]+=f[i-j]; f[i]%=mod; }*/ //回忆一下前缀和的算法模板 l=max(a,i-k); r=max(a,i-m); f[i]=(prefix[r]-prefix[l-1]+m)%m; prefix[i]=(prefix[i-1]+f[i])%m; } cout<<f[n]; return 0; }