假设你正在玩跳格子(所有格子排成一个纵列)游戏。需要 跳完n 个格子你才能抵达终点。
每次你可以跳 1 或 2 个格子。你有多少种不同的方法可以到达终点呢?
注意:给定 n 是一个正整数。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
int[] record = new int[i+1];
record[1]=1;
record[2]=2;
for (int j = 3; j <= i; j++) {
record[j]=record[j-1]+record[j-2];
}
System.out.println(record[i]);
}
}
Leetcode上有爬楼梯的原题。思路是找到到达 n-1 和 n-2 的方法个数然后相加。importjava.util.*;publicclassMain{publicstaticvoidmain(String[] args){Scanner sc = newScanner(System.in);while(sc.hasNext()){intn = sc.nextInt();if(n == 1){System.out.println(1);continue;}if(n == 2){System.out.println(2);continue;}int[] dp = newint[n + 1];dp[1] = 1;dp[2] = 2;for(inti = 3; i <= n; i++){dp[i] = dp[i - 1] + dp[i - 2];}System.out.println(dp[n]);}sc.close();}}
/*
动态规划:dp[i]表示跳上i格的所有方法数
其中dp[i] = dp[i-1]+dp[i-2];
*/
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] dp = new int[n+1];
dp[0] = 1;dp[1] = 1;
for(int i =2;i<=n;i++){
dp[i] = dp[i-1]+dp[i-2];
}
System.out.println(dp[n]);
}
} #include<bits/stdc++.h>
using namespace std;
int main() {
int n = 0;
cin >> n;
vector<int> f(n+1, 1);
for (int i=2; i<=n; ++i) {
f[i] = 0;
f[i] = f[i-1] + f[i-2];
}
cout << f[n] << endl;
return 0;
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= n; i++) {
if (i <= 2) {
list.add(i);
} else {
list.add(list.get(i - 3) + list.get(i - 2));
}
}
System.out.println(list.get(list.size() - 1));
}
}
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(Jump(n));
}
public static int Jump(int conclusion){
if(conclusion == 1) return 1;
else if(conclusion == 2) return 2;
else return Jump(conclusion-1)+Jump(conclusion-2);
}
} n = int(input()) dp = [0 for i in range(n)] dp[0]=1 dp[1]=2 for i in range(2,len(dp)): dp[i] = dp[i-1]+dp[i-2] count = dp[n-1] print(count)
解析:每次只用考虑之后一种情况,第i个台阶有两种方法:从前一个台阶跳过来或是从前两个台阶跳过来,将每个台阶的方法的存入dp中,那么第i个台阶的方法则是dp[i-1]+dp[i-2]。最后的递归出口:1个台阶是一种方法,两个台阶是两种方法。
斐波那契,dp来做,可以状态压缩
1. import java.util.Scanner;
2. import static java.lang.System.in;
3. public class Main {
4. public static void main(String[] args) {
5. Scanner sc = new Scanner(in);
6. int n = sc.nextInt();
7. int f1 = 1, f2 = 1;
8. int temp = 0;
9. for (int i = 2; i <=n; i++) {
10. temp = f1 + f2;
11. f1 = f2;
12. f2 = temp;
13. }
14. System.out.println(f2);
15. }
16. }
n = int(input()) p, q = 1, 2 r = 1 if n == 1 else 2 for _ in range(2, n): r = p + q p = q q = r print(r)java递归解法
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine().trim());
System.out.println(fibonacci(n));
}
private static int fibonacci(int n){
if(n == 1)
return 1;
else if(n == 2)
return 2;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
} n = int(input()) if n == 1: print(1) elif n == 2: print(2) else: a = 1 b = 2 t = 2 while t < n: a,b = b,a+b t += 1 print(b)
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int in = sc.nextInt();
System.out.println(tiaogezi(in));
sc.close();
}
public static int tiaogezi(int n) {
if (n <= 0) {
return 0;
}
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
return tiaogezi(n - 1) + tiaogezi(n - 2);
}
} import java.util.Scanner;
public class Dump {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int num=sc.nextInt();
int a=1,b=1,sum=0;
if(num==1)
System.out.println(1);
for(int i=2;i<=num;i++){
sum=a+b;//f(n)=f(n-1)+f(n-2)
a=b;
b=sum;
}
System.out.println(sum);
}
}