赛码 上台阶(C++)

题目地址:http://exercise.acmcoder.com/online/online_judge_ques?ques_id=1668&konwledgeId=136

思路1(动态规划):

设定人现在在台阶1层,每次只能上1层到两层,到台阶1层有0种走法,到台阶2层有1种走法,到台阶3层有2种走法,这样我们已经知道底部子问题的解。

f(n)=f(n-1)+f(n-2),比如说4层只能由2层(跨两步)或3层到达(跨1步),因此4层的走法数应该是2层走法数和3层走法数的和。

使用一个数组来存储到某个台阶需要的步数,并自底向上更新值,数组[m]的值就是m层的可能走法数。

#include "iostream"
using namespace std;
int num[40]={0,0,1,2};
int step(int k)
{
    if(k==1)
        return 0;
    if(k==2)
        return 1;
    if(k==3)
        return 2;
    for(int i=4;i<=k;i++)
    {
        num[i] = num[i-1]+num[i-2];
    }
    return num[k];
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int m;
        cin>>m;
        cout<


思路2(调用自身递归)

递推公式:f(n)=f(n-1)+f(n-2),比如说4层只能由2层(跨两步)或3层到达(跨1步),因此4层的走法数应该是2层走法数和3层走法数的和。

结束状态:到台阶1层有0种走法,到台阶2层有1种走法,到台阶3层有2种走法,

#include "iostream"
using namespace std;
int step(int k)
{
    if(k==1)
        return 0;
    if(k==2)
        return 1;
    if(k==3)
        return 2;
    return step(k-1)+step(k-2);
}
int main()
{
    int n;
    cin>>n;
    while(n--)
    {
        int m;
        cin>>m;
        cout<


类似的题目还有NOI 3089:爬楼梯(C++)

题目地址:http://noi.openjudge.cn/ch0202/3089/

递归解法如下:(动态规划的方法同上述思路一)

#include "iostream"
using namespace std;
int step(int k)
{
    if(k==1)
        return 1;
    if(k==2)
        return 2;
    return step(k-1)+step(k-2);
}
int main()
{
    int m;
    while(cin>>m) {
        cout << step(m) << endl;
    }
}





你可能感兴趣的:(OJ,动态规划,递归和自调用函数)