上台阶-每次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;
}
运行效果
相关练习
1、 每次上1个或者2个台阶的动态规范实现方式
2、其他