8.吃鱼丸(题解)

Easenyang 挖井人 2022-12-06 17:13:23

本题类似于斐波那契数列,可以用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);
	}
}

 

...全文
295 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

43

社区成员

发帖
与我相关
我的任务
社区描述
西师学习小分队
javac++ 高校 四川省·南充市
社区管理员
  • Easenyang
  • 陌上花开0
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧