[ターン] [ソードフィンガーオファー]:ロープカットプラクティス:長さnのロープを与えます。ロープを整数長のmセグメントにカットしてください。可能な最大の製品は何ですか?

[ターン] [ソードフィンガーオファー]:ロープを切る

タイトルの説明では、長さnのロープが表示されます。ロープを整数長のmセグメントに切断してください(mとnは整数、n> 1とm> 1)。各セグメントの長さはk [0]です。 、k [1]、...、k [m]。k [0] xk [1] x ... xk [m]の可能な最大積は何ですか?例えば、ロープの長さが6本の場合、3本と3本の3本に切断し、その時の最大積は9本になります。


これは長さnのロープです。ロープを整数長のmセグメントにカットしてください(mおよびnは整数、n> 1およびm> 1)。各ロープの長さはk [0]、kです[1]、...、k [m]。k [0] xk [1] x ... xk [m]の可能な最大積は何ですか?例えば、ロープの長さが6本の場合、3本と3本の3本に切断し、その時の最大積は9本になります。

方法1:dp [length]メソッド

各dp [length]の最大値を計算します

import java.util.*;
/**
 * @ClassName: TestA
 * Date: 2020/8/29 19:28
 * project name: 20200829
 * @Description:
 */
public class TestA {
    
    
    public int cutRope(int length) {
    
    
        if(lengtht <= 1){
    
    
            return 0;
        }
        if(length == 2){
    
    
            return 1;
        }
        if(length == 3){
    
    
            return 2;
        }
        int[] dp = new int[length+1];
        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 3;
        for(int i=4;i<=length;i++){
    
    
            int ret = 0;
            for(int j=1;j<=i/2;j++){
    
    
                ret=Math.max(ret,dp[j]*dp[i-j]);
            }
            dp[i] = ret;
        }
        return dp[length];
    }

public static void main(String[] args) {
    
    
    TestA t = new TestA();
    System.out.println(t.cutRope(10));
}
}

结果:36

方法2:法を見つける

いくつかの小さい整数の最適解を見つける法則。
length = 0、最適解:なし、0を返す
length = 1、最適解:なし、0を返す
length = 2、最適解:1 1
length = 3、最適解:1 2
length = 4、最適解:2 2
length = 5、最適解:3 2
target = 6、最適解:3 3
length = 7、最適解:3 2 2
length = 8、最適解:3 3 2
target = 9、最適解:3 3 3
長さ= 10、最適解:3 3 2 2

public class Solution {
    
    
    public int cutRope(int target) {
    
    
        if(target <= 1){
    
    
            return 0;
        }
        if(target == 2){
    
    
            return 1;
        }
        if(target == 3){
    
    
            return 2;
        }
      
        int length = target%3==0?target/3:target/3+1;
        int length2 = 3-target%3;
        int result = 1;
        for(int i=0;i<length;i++){
    
    
            result=result*(i<length-length2?3:2);
        }
        return result;
    }
}

おすすめ

転載: blog.csdn.net/qq_42005540/article/details/108299933