From ffd83ca8cc5197b423af1b530172813a929607c8 Mon Sep 17 00:00:00 2001 From: Leo <582717189@qq.com> Date: Fri, 15 Jan 2021 11:09:38 +0800 Subject: [PATCH] Tower test --- src/leo/class22/KillMonster.java | 43 +++++++++++++++ src/leo/class22/splitNumber.java | 92 ++++++++++++++++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 src/leo/class22/KillMonster.java create mode 100644 src/leo/class22/splitNumber.java diff --git a/src/leo/class22/KillMonster.java b/src/leo/class22/KillMonster.java new file mode 100644 index 0000000..c352d18 --- /dev/null +++ b/src/leo/class22/KillMonster.java @@ -0,0 +1,43 @@ +package leo.class22; + +/** + * @author Leo + * @ClassName KillMonster + * @DATE 2021/1/14 9:06 下午 + * @Description + * + * 给定3个参数,N,M,K + * 怪兽有N滴血,等着英雄来砍自己 + * 英雄每一次打击,都会让怪兽流失[0~M]的血量 + * 到底流失多少?每一次在[0~M]上等概率的获得一个值 + * 求K次打击之后,英雄把怪兽砍死的概率 + */ +public class KillMonster { + + static class Recursion{ + public static double kill(int n, int m, int k) { + if (n < 1 || m < 1 || k < 1) { + return 0; + } + long ans = process(n, m, k); + return (double) ans / Math.pow(m + 1, k); + } + + private static long process(int hp, int m, int rest) { + if (hp <= 0) { + return (long) Math.pow(m + 1, rest); + } + if (rest == 0) { + return hp == 0 ? 1 : 0; + } + int ans = 0; + for (int i = 0; i <= m; i++) { + ans += process(hp - i, m, rest - 1); + } + return ans; + + } + + } + +} diff --git a/src/leo/class22/splitNumber.java b/src/leo/class22/splitNumber.java new file mode 100644 index 0000000..38363cb --- /dev/null +++ b/src/leo/class22/splitNumber.java @@ -0,0 +1,92 @@ +package leo.class22; + +/** + * @author Leo + * @ClassName splitNumber + * @DATE 2021/1/14 10:02 下午 + * @Description + * + * 给定一个正数1,裂开的方法有一种, + * (1) 给定一个正数2,裂开的方法有两种,(1和1)、 + * (2) 给定一个正数3,裂开的方法有三种,(1、1、1)、(1、2)、 + * (3) 给定一个正数4,裂开的方法有五种,(1、1、1、1)、(1、1、2)、(1、3)、(2、2)、 (4) + * 给定一个正数n,求裂开的方法数。 动态规划优化状态依赖的技巧 + */ +public class splitNumber { + static class Recursion { + public static int number(int n) { + if (n <= 0) { + return 0; + } + return process(n, 1); + } + + private static int process(int rest, int pre) { + if (rest == 0) { + return 1; + } + if (rest <= pre) { + return rest - pre == 0 ? 1 : 0; + } + int ans = 0; + for (int j = pre; j <= rest; j++) { + ans += process(rest - j, j); + } + return ans; + } + + } + + static class Dp{ + public static int number(int n) { + if (n <= 0) { + return 0; + } + int[][] dp = new int[n + 1][n + 1]; + for (int i = 1; i <= n; i++) { + dp[i][i] = 1; + dp[i][0] = 1; + } + for (int pre = n - 1; pre > 0; pre--) { + for (int rest = pre + 1; rest <= n; rest++) { + int ans = 0; + for (int j = pre; j <= rest; j++) { + ans+= dp[j][rest - j]; + } + dp[pre][rest] = ans; + } + } + return dp[1][n]; + } + } + + + static class OptDp{ + public static int number(int n) { + if (n <= 0) { + return 0; + } + int[][] dp = new int[n + 1][n + 1]; + for (int i = 1; i <= n; i++) { + dp[i][i] = 1; + dp[i][0] = 1; + } + for (int pre = n - 1; pre > 0; pre--) { + for (int rest = pre + 1; rest <= n; rest++) { + //下面的格子 + dp[pre][rest] = dp[pre+1][rest]; + //左侧的格子 + dp[pre][rest] += dp[pre][rest - pre]; + + } + } + return dp[1][n]; + } + } + public static void main(String[] args){ + System.out.println( Recursion.number(13)); + System.out.println(Dp.number(13)); + System.out.println(OptDp.number(13)); + } + +}