LeetCode : 343. Integer Break
这是一道第一眼看到就觉得有故事的题目!
想到用穷举法,用DFS去做,但问题在于,如果数字特别大,岂不会特别慢,即使可以剪枝,剩下的还是会有大量的重复。
然后就开始试着找规律,想用数学的方法去证明,能不能采用分治法或者贪心算法把这些规律搞掉。
对于C=A+B而言,当A=B=1/2*C时,A*B的乘积最大,但这种结果并不具备传递性。
既然是乘积,不免考虑到幂函数的情况,Y=X^n+(0,1,2,...,n-1)。要找到X等于多少的时候是最佳解。
毕业这么多年了,指数函数什么的早就忘了,最后证明无能,只能试一试,居然发现,貌似就是X就是等于3.
到了这一步,这个问题就简单了:
class Solution { public: int integerBreak(int n) { if(n==2) return 1; if(n==3) return 2; if(n==4) return 4; int result=0; int mod=n%3; if(mod==0){ result = pow(3,n/3); } if(mod==1){ result = pow(3,n/3-1)*4; } if(mod==2){ result = pow(3,n/3)*2; } return result; } };
搞定!