假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
int climbStairs(int n){
// 定义状态数组,保存达到已经遍历节点的次数
int f[n+1];
f[0] = 1;
f[1] = 1;
for(int i = 2; i <= n; i++){
// 第i阶楼梯,可以通过i-1阶爬一个或者从i-2阶爬两个
// 定义状态转移方程如下
f[i] = f[i-1] + f[i-2];
}
return f[n];
}
package com.heu.wsq.leetcode;
import java.util.ArrayList;
import java.util.List;
/**
* @author wsq
* @date 2021/3/21
*/
public class Sum1ToN {
/**
* 统计次数
*/
private static int ans = 0;
public static void main(String[] args){
List<Integer> list = new ArrayList();
int N = 16;
int start = 1;
dfs(N, list, start);
System.out.println("ans is : " + ans);
int[] f = new int[N + 1];
f[0] = 1;
f[1] = 1;
for(int i = 2; i <= N; i++){
f[i] = f[i-1] + f[i-2];
}
System.out.print("dp f[N] is : " + f[N]);
}
private static void dfs(int n, List<Integer> list, int start) {
if(n == 0){
// n 为0时,list中的元素正好求和等于将原来的N
printList(list);
}else{
// n 不为0时,使用1和2进行分解当前n,并进行递归分解n-i
for(int i = start; i <= n && i <= 2; i++){
// 将此时分解的i加入list队列
list.add(i);
dfs(n - i, list, 1);
// 这里要将当时加入的i移除,相当于回溯的思想,这里的remove和上面的add成对出现的
list.remove(list.size() - 1);
}
}
}
/**
* 打印列表中的值
* @param list
*/
private static void printList(List<Integer> list){
ans++;
int n = list.size();
for(int i = 0; i < n; i++){
System.out.print(list.get(i));
if(i != n - 1){
System.out.print("+");
}else{
System.out.println();
}
}
}
}