假设你正在玩跳格子(所有格子排成一个纵列)游戏。需要 跳完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); } }