题目
剑指 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]; } };