ロープの問題をカット(動的計画法、貪欲、再帰)

あなたは長さnの文字列を与える、mはロープセクション切断してください(mは、nは整数であり、N> 1およびM> 1)、
各ロープの長さは、kは[0]、Kと呼ばれる[1 ] 、···、K [M]。[0] XK [1] k個ます X ... XK [m]の最大の可能な製品はどのくらいですか?
ロープの長さ8:00である場合、例えば、現時点で得られた生成物2,3,3は最大18である三つのセクションの長さにカット。

考え

ことに注意してください
長さが最大製品ロープを得るために3 F [N]よりも大きい場合

ダイナミックプログラミング

フィーチャー
問題ダウンの分析からは、ボトムアップからの問題を解決するために、

  • 最適解を求める;(最大又は最小)
  • 問題は、いくつかの下位問題に分解され、より小さな部分問題だけでなく、重なり合う部分問題との間にすることができます
  • 小さな問題の最適解の問題全体の最適解を組み合わせることができるかどうかの小さな問題は、最適解が存在し、分解した後、あなたは、動的プログラミングを使用することができます
実現
public int cutRope(int target) {
    //排除特殊情况
    if (target < 2) {
        return 0;
    }
    if (target == 2) {
        return 1;
    }
    if (target == 3) {
        return 2;
    }
    int[] products = new int[target + 1];
    products[0] = 0;
    products[1] = 1;
    products[2] = 2;
    products[3] = 3;
    for (int i = 4; i <= target; i++) {
        int max = 0;
        for (int j = 1; j <= i / 2; j++) {
            int product = products[j] * products[i - j];
            max = Math.max(max, product);
        }
        products[i] = max;
    }
    return products[target];
}

貪欲

  • 乗算ので、次に乗算の大部分に加えて、結果になります。
  • したがって、2から考え始めます。しかし言葉は、必然的に、セグメント1の奇数が含まれている2分けされているので、1乗算器の廃棄物と同等なので、私たちは3でなければならない最後の左側には、そこで彼は、長さが2、3のセグメント数に入るためになった場合それは最高です。
  • そして、説明3 2 2ほど良好ではない3、および比較的より2〜3をしなければならない2 * 2 * 2 <3 * 3ので。
  • 3の数余りが2であれば、分割をしましょうが、2、N 3、最適解に分割されて余りが1である場合、それは2 2に分割されるべきである、N-1が最適3ソリューション
実現
public int cutRope(int target) {
    //排除特殊情况
    if (target < 2) {
        return 0;
    }
    if (target == 2) {
        return 1;
    }
    if (target == 3) {
        return 2;
    }
    int timesOf3 = target / 3;
    if (target - timesOf3 * 3 == 1) {
        timesOf3--;
    }
    int timesOf2 = (target - timesOf3 * 3) / 2;
    int result = (int) (Math.pow(3, timesOf3) * Math.pow(2, timesOf2));
    return result;
}

再帰

再帰的に高いよりも、ダイナミックプログラミングが、私は再帰的に繰り返す場合の解決が多いので、そこに行くかわからない
が、私はインターネット上で見、あなたがプレーを見そう際、ロープ再帰的な解決策をカットしていないようです...

考え

F(N)= MAX(F(I)* F(NI))0 <iがn <

実現
public int cutRope03(int target) {
    if (target < 2) {
        return 0;
    }
    if (target == 2) {
        return 1;
    }
    if (target == 3) {
        return 2;
    }
    int max = 0;
    for (int i = 1; i <= target/2; i++) {
        max = Math.max(cutRope03Core(i) * cutRope03Core(target - i), max);
    }
    return max;
}

private int cutRope03Core(int target) {
    if (target < 4) {
        return target;
    }
    int max = 0;
    for (int i = 1; i <= target/2; i++) {
        max = Math.max(cutRope03Core(i) * cutRope03Core(target - i), max);
    }
    return max;
}

おすすめ

転載: www.cnblogs.com/aiguozou/p/11576036.html