/* f[i]:代表数字i的剪成m段的最大值 f[i] = max(f[i],j*f[i-j]) m最小为2。因此 f[2]返回 1 ,f[3]返回2. 但是当动态规划时,n>=4时 f[2]=2;不是1 可以不划分返回2 f[3]=3;不是2 可以不划分返回3 后面的得到的一定满足f[n]>=n,即划分一定比不划分的值大。因此不需要单独考虑 f[4]:f[3]*1=3 f[2]*2=4 f[1]*3=3 f[5]:f[1]*4=4 f[2]*3=6 f[3]*3=9 f[4]*1=4 */ class Solution { public: int cutRope(int number) { if (number == 2) return 1; if (number == 3) return 2; vector<int> f(number + 1, 0); f[2] = 2; f[3] = 3; // f[2 ,3]例外划分过后,没有原来的值大 for (int i = 4; i <= number; ++i) { for (int j = 1; j < i; ++j) { f[i] = max(f[i], j * f[i - j]); } } return f[number]; } };