leetcode 劍指offer14 割繩子 動態規劃

package jianzhioffer;
/**
 * 割繩子1
 * 一般想到的都是動態規劃 從長爲n的繩子中割出m段,m和n都大於1,
 * 首先思考動態規劃遞推關係,設f(n)爲長度爲n的繩子的最大乘積
 * 那我們考慮f(n)是從前一次切割中產生的,假設前一次切割的位置
 * 是i(1<=i<=n),那麼前一次切割便產生了(i)和(n-i)兩段,那麼便有了
 * f(n)=max(f(i)*f(n-i))),最後一次切割肯定是選的能產生最大乘積的
 * 兩段,但是我們不能確定i因此只能進行循環搜索,找出最大的方案,同時
 * 可以縮減i的搜索範圍[1,2/n],只需要搜索一般即可。
 *
 * 然後開始考慮初始化問題,分爲兩部分(n<4)和(n>=4),小於4的部分其實最優解是不切割,但是題目要求要切割,因此直接返回即可
 * 大於等於4的部分計算時針對f(1)f(2)f(3)直接初始化爲123,因爲這纔是最優解,換句話來說就是大於等於4的繩子當子段切割到長度
 * 爲123時便不再切割,這樣纔是最優解
 * */
public class Q14 {
    public int cuttingRope(int n) {
        int maxRe[] = new int[n + 1];
        if (n < 2) return 0;
        if(n==2) return 1;
        if(n==3) return 2;
        maxRe[2] = 2;
        maxRe[3] = 3;
        maxRe[1] = 1;
        for (int i = 4; i <= n; i++) {
            int max = 0;
            for (int j = 1; j <= i / 2; j++) {
                max = Math.max(max, (maxRe[j]* maxRe[i - j]));
            }
            maxRe[i] = max;
        }
        return maxRe[n];
    }
    public static void main(String argcp[]){
        System.out.println(new Q14().cuttingRope(8));
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章