题目
思路
- 思路一:暴力递归,对于每个大于1的数字来说,它都可以有若干个2或3组成,并且拆成2或3的积最大,因此,递归的时候我们可以将数拆分为n-2或n-3,取它们的最大值
- 思路二:备忘录
- 思路三:动态规划,定义dp[i]表示切分后最大能表示的数,dp[i] = Math.max(dp[i-2]2,dp[i-3]3)
-
代码
//1.暴力递归public int cuttingRope(int n) {if (n == 2 || n == 1) return 1;if (n == 3) return 2;return recur(n);}//当n > 1时,由于每个数由若干个2、3组成,所以每次每个数可以分割为2或3,并且拆成2或3的积最大public int recur(int n) {if (n <= 3) return n;return Math.max(recur(n - 2) * 2, recur(n - 3) * 3);}//2.备忘录int[] dp;public int cuttingRope(int n) {if (n == 2 || n == 1) return 1;if (n == 3) return 2;dp = new int[n + 1];return recur(n);}public int recur(int n) {if (n <= 3) return n;if (dp[n] != 0) return dp[n];dp[n] = Math.max(recur(n - 2) * 2, recur(n - 3) * 3);return dp[n];}//3.动态规划public int cuttingRope(int n) {if (n == 2 || n == 1) return 1;if (n == 3) return 2;//dp[i]表示当前i可分割后最大值int[] dp = new int[n + 1];dp[1] = 1; dp[2] = 2; dp[3] = 3;for(int i = 4; i <= n; i++) {dp[i] = Math.max(dp[i - 2] * 2, dp[i - 3] * 3);}return dp[n];}//4.由于每次只用到了前2个变量,所以可以优化dp数组public int cuttingRope(int n) {if (n == 2 || n == 1) return 1;if (n == 3) return 2;int p1 = 1, p2 = 2, p3 = 3;for(int i = 4; i <= n; i++) {int t = p3;p3 = Math.max(p2 * 2, p1 * 3);p1 = p2;p2 = t;}return p3;}
