https://leetcode.com/problems/integer-break/
动态规划,O(N^2)算法的话就是 枚举, p[i] = max(p[j]*p[i-j]);
注意初始化的p[0-4]是为了后面的计算。
贪心的话,基本上就是把N分解为 3 以及最后剩余的数 。 n = 4时,还是4;
直观的解释 3(n-3)>2(n-2)> 1*(n-1); (以n=5为例,故n>=5时,尽量分解为3)
class Solution {
public:
int integerBreak(int n) {
if (n==2)return 1;
if (n==3)return 2;
// way 1 :
// int *p = new int[n+1];
// p[0] = 0;
// p[1] = 1;
// p[2] = 2;
// p[3] = 3;
// for (int i=4;i<=n;i++)
// {
// int ans = 0;
// for (int j=1;j<=i/2;j++)
// {
// p[i] = p[i-j]*p[j];
// if (p[i]>ans)ans = p[i];
// }
// p[i] = ans;
// }
// int ans = p[n];
// delete[] p;
// return ans;
// way 2:
int ans = 1;
while (n>4)
{
ans*=3;
n-=3;
}
return ans*n;
}
};