爬樓梯2

題目描述

在你面前有一個n階的樓梯(n>=100且n<500),你一步只能上1階或3階。
請問計算出你可以採用多少種不同的方式爬完這個樓梯(到最後一層爲爬完)。

輸入描述:

一個正整數,表示這個樓梯一共有多少階

輸出描述:

一個正整數,表示有多少種不同的方式爬完這個樓梯

示例1

輸入

100

輸出

24382819596721629

#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
string add(string dp1,string dp2){
    string res="";
    int i=dp1.size()-1,j=dp2.size()-1,k=0;
    vector<int>data(max(dp1.size(),dp2.size())+1);
    fill(data.begin(),data.end(),0);
    int bit=0;
    for(;i>=0||j>=0;--i,--j){
          if(i>=0&&j>=0){
            data[k++]=dp1[i]-'0'+dp2[j]-'0';
            }
        else if(i>=0){
            data[k++]=dp1[i]-'0';
            }
        else if(j>=0){
            data[k++]=dp2[j]-'0';
            }
    }
    for(int t=0;t<k||bit;++t){//這個地方注意,不要想當然的認爲進位只有1,也可能爲2
        if(bit){
            res+=to_string((data[t]+bit)%10);
            bit=(data[t]+1)/10;
        }
        else{
            res+=to_string(data[t]%10);
            bit=data[t]/10;
        }
    }
    return string(res.rbegin(),res.rend());
}
int main()
{
    int n;
    cin>>n;
    vector<string>dp(n+1);
    dp[0]="1";
    dp[1]="1";
    dp[2]="1";
    dp[3]="2";
    if(n<=3) {
        cout<<dp[n]<<endl;
        return 0;
    }
    for(int i=4;i<=n;++i)
        dp[i]=add(dp[i-1],dp[i-3]);
    cout<<dp[n]<<endl;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章