题目链接

整数拆分

题目描述

image.png

实现代码

动态规划思想:记dp[i]表示数字i的拆分次数,我们最终要求的是dp[n],首先初始化条件:

  1. dp[0] = 0
  2. dp[1] = 1

然后编写状态转移方程:

dp[i] = max(dp[i-1] _1, dp[i-2] _2, … dp[i-i+1] * 1)

这里我们还需要考虑一点:即拆分成两个数的情况,所以状态转移方程除了上述的最大值外,还要取下列情况的最大值:

dp[i] = max((i-1) 1, (i-2) 2, … (i-i+1) * (i-1))

实现代码:

  1. class Solution {
  2. public int integerBreak(int n) {
  3. int[] dp = new int[n + 1];
  4. dp[0] = 0;
  5. dp[1] = 1;
  6. int result = 0;
  7. for (int i = 2; i <= n; i++) {
  8. int max = -1;
  9. for (int j = 1; j < i; j++) {
  10. max = Math.max(Math.max(dp[j] * (i - j), j * (i - j)), max);
  11. }
  12. dp[i] = max;
  13. if (i == n) {
  14. result = Math.max(result, max);
  15. }
  16. }
  17. return result;
  18. }
  19. }