43
社区成员
发帖
与我相关
我的任务
分享本题类似于斐波那契数列,可以用DP或DFS求解
解法1:DP
对于任意一个状态dp【i】,都由dp【i-1】和dp【i-3】之和组成,初始化dp【1】【2】【3】分别为1,1,2
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n = new Scanner(System.in).nextInt();
long[] dp = new long[75];
dp[1] = 1;
dp[2] = 1;
dp[3] = 2;
for (int i = 4; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-3];
}
System.out.println(dp[n]);
}
}
解法2:DFS
可以借助数组进行记忆化剪枝,若某个数已经存在,直接返回,很多场景不进行记忆化剪枝会超时
public class Main {
static long res = 0;
static long[] flag = new long[75];
public static void main(String[] args) {
flag[1] = 1;
flag[2] = 1;
flag[3] = 2;
int n = new Scanner(System.in).nextInt();
System.out.println(dfs(n));
}
public static long dfs(int n) {
if (n < 0) {
return 0;
}
if (flag[n] != 0) { //记忆化剪枝
return flag[n];
}
return flag[n] = dfs(n - 3) + dfs(n - 1);
}
}