动态规划计算机

Leetcode - Integer Break

2016-08-28  本文已影响6人  Richardo92

My code:

public class Solution {
    public int integerBreak(int n) {
        if (n <= 0) {
            return 0;
        }
        
        int[] dp = new int[n + 1];
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            int begin = 1;
            int end = i - 1;
            int max = 0;
            while (begin <= end) {
                int n1 = dp[begin] * end;
                int n2 = dp[begin] * dp[end];
                int n3 = begin * end;
                int n4 = begin * dp[end];
                max = Math.max(max, Math.max(n1, Math.max(n2, Math.max(n3, n4))));
                begin++;
                end--;
            }

            dp[i] = max;
        }
        
        return dp[n];
    }
}

我的思想和 perfect square 这道题目很类似。
如果是 8
那么
1, 7
2, 6
3, 5
4, 4
可以组成他。
然后1,2,3,4,5,6,7
又可以再细分,
或者不分。
所以对于每个组合,可以有四种结果,拿出最大的就行。
比如,
3, 5
可以是
3 * 5
(1 * 2) * 5
3 * (2 * 3)
(1 * 2) * (2 * 3)

最大值是18
所以 dp[8] = 18

time complexity : O(n ^ 2)

然后答案说有一种O(n) 的解法:
https://discuss.leetcode.com/topic/55120/my-simple-dp-solution-o-n

看了下,就是找规律。没什么意思。。。
然后据说还有 O(log n) 的解法,也是玩数学游戏。不是很有意思。就不研究了.

Anyway, Good luck, Richardo! -- 08/27/2016

上一篇下一篇

猜你喜欢

热点阅读