上台阶-每次1、2、3个台阶

266 阅读3分钟

上台阶-每次1、2、3个台阶

问题描述

上台阶,每次上1个、2个或者3个台阶,每次都有三种不同的走法。问有N个台阶时候,一共有多少种走法。上限 70内 。

输入: 一个数字表示第几个台阶,输入0程序结束 输出:到该台阶有多少种走法

分析

对比,1、2步台阶的走法。是斐波那契数列,是前两项的和等于当前项的值。1、2、3步台阶的走法就是前三项的和等于当前项的值。

编程实现


int main() {
    std::cout << "Welcome to CHEN YUAN Coding  .  Phone : 025 - 8662 0610" <<std::endl;


    long long N =0;
    long long i,j,k ,c,v;
    cout<<"please enter A num N (Application stop when N is 0):";


    while (true){
        cin >> N;
        if(0==N){
            break;
        }else if( !(N>0 && N<71)){
            cout<<"please enter A num N (1-70):";
            continue;
        } else {
            if(N==1){
                c=1;
            }else if(N==2){
                c=2;
            }else if(N==3){
                c=4;
            }else{
                i=1;
                j=2;
                k=4;
                for(v=N;v>=4;v--){
                    c=i+j+k;
                    i=j;
                    j=k;
                    k=c;
                }
            }
            printf("N==%d,total way is %d ... ... \n",N,c);
            cout<<"please enter A num N (Application stop when N is 0):";
        }
    }

    cout<<" The ending ... ..."<<endl;
    return 0;
}

运行结果如下 :


D:\c++\chenyuanedu\base_langue\cmake-build-debug\base_langue.exe
Welcome to CHEN YUAN Coding  .  Phone : 025 - 8662 0610
please enter A num N (Application stop when N is 0):1
N==1,total way is 1 ... ...
please enter A num N (Application stop when N is 0):2
N==2,total way is 2 ... ...
please enter A num N (Application stop when N is 0):3
N==3,total way is 4 ... ...
please enter A num N (Application stop when N is 0):4
N==4,total way is 7 ... ...
please enter A num N (Application stop when N is 0):5
N==5,total way is 13 ... ...
please enter A num N (Application stop when N is 0):6
N==6,total way is 24 ... ...
please enter A num N (Application stop when N is 0):7
N==7,total way is 44 ... ...
please enter A num N (Application stop when N is 0):8
N==8,total way is 81 ... ...
please enter A num N (Application stop when N is 0):9
N==9,total way is 149 ... ...
please enter A num N (Application stop when N is 0):10
N==10,total way is 274 ... ...
please enter A num N (Application stop when N is 0):11
N==11,total way is 504 ... ...
please enter A num N (Application stop when N is 0):12
N==12,total way is 927 ... ...
please enter A num N (Application stop when N is 0):111
please enter A num N (1-70):13
N==13,total way is 1705 ... ...
please enter A num N (Application stop when N is 0):0
 The ending ... ...

Process finished with exit code 0

扩展

思考:

每次输入第几个台阶,都需要计算一次,即使是输入同样的数字,也是要重新计算的。是不是不好!!!

是不是有把规划内的,比如1-70的计算结果存储下来,输入N在 1-70 的时候,直接取出结果,是不是更好。

提前把一定范围内的结果计算出来,存储好,按照输入取对应的结果,就是动态规划。

动态规划方式的实现


int main() {
    std::cout << "Welcome to CHEN YUAN Coding  .  Phone : 025 - 8662 0610" <<std::endl;


    long long N,FN[71];

    FN[1]=1;
    FN[2]=2;
    FN[3]=4;
    for(int i=4;i<71;i++){
        FN[i]=FN[i-1]+FN[i-2]+FN[i-3];
    }


    for(;;){
        cout<<"please enter A num N (Application stop when N is 0):";
        cin >> N;
        if(0==N){
            break;
        }else if( !(N>0 && N <71)){
            cout<<"please enter A num N (1-70):";
        }else{
            printf("N==%d,total way is %d ... ...\n",N,FN[N]);
        }
    }



    cout<<" Main func The ending ... ..."<<endl;
    return 0;
}

运行效果

image.png

相关练习

1、 每次上1个或者2个台阶的动态规范实现方式

2、其他