343. 整数拆分

 1 //以3来进行划分
 2 class Solution 
 3 {
 4 public:
 5     int integerBreak(int n) 
 6     {
 7         if(n <= 3) return n - 1;  //必须切一刀
 8         //n >= 5 2*(n-2) > n   3*(n-3) > n  且3*(n-3) >= 2*(n-2)
 9         //n = 4 2 * 2 > 1 * 3
10         //2和3不能再分了  分了就变小了 且3优于2
11         int a = n / 3;
12         int b = n % 3;
13         if(b == 0)
14         {
15             //全部分成3
16             return pow(3, a);
17         }
18         if(b == 1)
19         {
20             //n = 10 3 * 3 * 3 * 1 ==> 3 * 3 * 2 * 2
21             //4   1 和 3 要变成2 * 2
22             return pow(3, a-1) * 4;
23         }
24         //b == 2  2不能再分了
25         return pow(3, a) * 2;
26     }
27 };

 

 1 class Solution 
 2 {
 3     vector<int> memo;
 4 public:
 5     int integerBreak(int n) 
 6     {
 7         memo = vector<int>(n + 1,-1);
 8         return f(n);
 9     }
10 
11     int f(int n)
12     {
13         if(n == 1) return 1;
14         if(memo[n] != -1) return memo[n];
15         int res = -1;
16         // n可以拆分成两个数,也可以拆分多个数。拆分成两个数的时候乘积就是i * (n - i),
17         // 也可以选择继续拆分:f(n - i)就是将n - i继续拆分的结果
18         for(int i = 1;i < n;i ++) res = max(res,max(i * (n - i),i * f(n - i)));// 至少分割两个正整数
19         memo[n] = res;
20         return memo[n];
21     }
22 };

 

posted @ 2020-04-22 18:53  Jinxiaobo0509  阅读(164)  评论(0)    收藏  举报