跳台阶

链接:https://www.nowcoder.com/acm/contest/90/A
来源:牛客网

题目描述

小明在坐景驰科技研发的无人车到达了目的地。
景驰科技(JingChi.ai)是一家由人工智能技术驱动、以无人驾驶技术为核心的智能出行公司。它将打造面向中国市场的全无人驾驶。
从无人车下来以后,小明看到了一个长长的楼梯。
有一个n级台阶的楼梯,小明一次可以向上跳1步,两步,甚至是n步,请问小明跳到n级台阶有多少种跳法?

输入描述:

第一行输入一个整数t,代表有t组样例:( T<=30)
接下来的t行,都用一个整数n,表示楼梯有n级台阶( 1<=n<=30)

输出描述:

输出跳到第n级台阶有多少种跳法

输入

1
1

输出

1
开始我是这么做的
#include <bits/stdc++.h>
using namespace std;
int dp[100][100];
int main()
{
   int T,n;
   cin>>T;
   while(T--)
   {
       memset(dp,0,sizeof(dp));
       cin>>n;
       dp[0][0]=1;
       for(int i=1;i<=n;i++)
       {dp[i][1]=1;
           for(int j=2;j<=i;j++)
            {
                for(int k=i-j;k<i;k++)
                {
                 if(k>j-1)
                 dp[i][j]=dp[k][j-1]+dp[i][j];
                 else
                   dp[i][j]=dp[k][k]+dp[i][j];
                }
            }
       }
       cout<<dp[n][n]<<endl;
   }
}


后来找到规律
#include <bits/stdc++.h>
using namespace std;
int mi(int a,int b)
{
    int ans=1;
    for(int i=0;i<b;i++)
    {
        ans=ans*a;
    }
    return ans;
}
int main()
{
   int T,n;
   cin>>T;
   while(T--)
   {
       cin>>n;
       cout<<mi(2,n-1)<<endl;
   }
   return 0;
}

再后来发现可以把第一种解法化简
#include <bits/stdc++.h>
using namespace std;
int p[100];
int main()
{
   int T,n;
   cin>>T;
   while(T--)
   {
       memset(p,0,sizeof(p));
       cin>>n;
       p[0]=1;
       for(int i=1;i<=n;i++)
       {
           for(int j=0;j<i;j++)
           {
               p[i]=p[i]+p[j];
           }
       }
       cout<<p[n]<<endl;
   }
   return 0;
}



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