leet code 面试题14- I. 剪绳子

这个题目是在剑指offer上看到的,当时以为自己看明白了,自己写的时候发现还是思考的不够细致,主要有一下几点:

1,当n = 1、2、3时应该直接返回固定的值,这一点应该大家应该都能想到,我在写的时候漏掉了3.。。。

2,在实际分割的时候定义了rope_maxlen数组来存储每个长度对应的最大分割乘积值,但是0-3的定义如下:

   rope_maxlen[1] = 1;
        rope_maxlen[2] = 2;
        rope_maxlen[3] = 3;
为什么会这样呢???
因为在实际分割是如果分割结果中有一段是以上三个值中的任意一个,那它对应的最长分割乘积就是它自己的长度,因为此时已经割了一刀了,在以上三个值长度绳子上再割一刀不是必须的了,那么它对应的最大乘积值就是它自身,即不再分割
3,在定义数组时,数组长度应该比n大1,原因大家应该已经想到了;
最后奉上我的代码,感觉比书上写的要稍微简洁一点:
class Solution {
public:
    int cuttingRope(int n) {
        if (n < 2) {
            return 0;
        }
        if (n == 2) {
            return 1;
        }
        if (n == 3) {
            return 2;
        }
        vector<int> rope_maxlen(n+1);
        for (int k=0; k<=n; k++) {
            rope_maxlen[k] = 0;
        }

        rope_maxlen[1] = 1;
        rope_maxlen[2] = 2;
        rope_maxlen[3] = 3;
        
        if (n<4) {
            return rope_maxlen[n];
        }

        for (int i=4; i<=n; i++) {
            for (int j=1; j<=i/2; j++) {
                rope_maxlen[i] = std::max(rope_maxlen[i], rope_maxlen[j]*rope_maxlen[i-j]);
            }
        }

        return rope_maxlen[n];
    }
};
原文地址:https://www.cnblogs.com/rulin/p/13034895.html