343. 整数拆分(同剑指 Offer 14- I. 剪绳子) - 7月30日

题目

剑指 Offer 14- I. 剪绳子

我的思路

我有两种思路,首先是数学方法,证明拆分成尽量多的3和2乘积最大即可。时间复杂度1

第二是动态规划,每个整数拆分的最大乘积可以由小于它的整数拆分最大乘积决定,状态转移方程m[n]=max{m[i]*m[n-i]}, 1<i<m-1。时间复杂度n^2

上面两种方法的具体实现见https://www.cnblogs.com/BoysCryToo/p/13396393.html

下面阐述一下官方题解中的被优化的动态规划方法:

其实是对上面状态转移方程的优化,证明了当i>=4时,不可能成绩更大所以只讨论i=2和i=3的情况。由此

复杂度On。

我的实现

class Solution {
public:
    int integerBreak(int n) {
        if (n < 4) {
            return n - 1;
        }
        vector <int> dp(n + 1);
        dp[2] = 1;
        for (int i = 3; i <= n; i++) {
            dp[i] = max(max(2 * (i - 2), 2 * dp[i - 2]), max(3 * (i - 3), 3 * dp[i - 3]));
        }
        return dp[n];
    }
};

拓展学习

猜你喜欢

转载自www.cnblogs.com/BoysCryToo/p/13402570.html