一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。
数据范围:
进阶:空间复杂度
, 时间复杂度
进阶:空间复杂度
自上而下地将大问题分解为规模更小但性质相同的小问题,对于第i个台阶,它可以从i-1跳上来,也可以从i-2跳上来,...,直到第一个台阶跳上来。
例如dfs(4):
dfs(3)=dfs(2)+dfs(1)
dfs(2)=dfs(1)
dfs(1)=dfs(0)=1因此
dfs(3)=dfs(0)+dfs(0)+dfs(0)+dfs(0)=4
定义dfs(i)表示调到第i个台阶的总跳法,i从1开始,那么边界就是当i=0时,表示找到了一组答案,返回1。
#include <iostream>
using namespace std;
int n;
int dfs(int i)
{
if (i == 0) return 1;
int res = 0;
for (int j = 1; j <= i; j++)
res += dfs(i - j);
return res;
}
int main()
{
cin >> n;
cout << dfs(n) << endl;
return 0;
}
#include <stdio.h>
int main() {
int a;
scanf("%d", &a);
printf("%d\n", 1<<(a-1));
return 0;
} import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
int n=0;
while (in.hasNextInt()) { // 注意 while 处理多个 case
n = in.nextInt();
}
if(n==1||n==2){
System.out.println(n);
return;
}
int dp[]=new int[n+1];
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n;i++){
for(int j=1;j<i;j++){
dp[i]+=dp[j];
}
dp[i]+=1;
}
System.out.println(dp[n]);
}
} public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int[] dp = new int[n+2];
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
for(int i = 3;i < dp.length;i++) {
for(int j = 0;j < i;j++) {
dp[i] = dp[i] + dp[j];
}
//加上1到n的
dp[i] = dp[i] + 1;
}
System.out.println(dp[n]);
}