[Turn] [Sword Finger Offer]: Práctica de corte de cuerda: déle una cuerda de longitud n, corte la cuerda en m segmentos de longitud entera, ¿cuál es el producto máximo posible?

[Turn] [Sword Finger Offer]: Corta la cuerda

La descripción del título te da una cuerda de longitud n. Corta la cuerda en m segmentos de longitud entera (myn son números enteros, n> 1 y m> 1), y la longitud de cada segmento es k [0] , k [1], ..., k [m]. ¿Cuál es el producto máximo posible de k [0] xk [1] x ... xk [m]? Por ejemplo, cuando la longitud de la cuerda es 6, la cortamos en tres longitudes de 3 y 3, y el producto máximo obtenido en este momento es 9.


Aquí hay una cuerda con una longitud de n. Corta la cuerda en m segmentos de longitud entera (myn son números enteros, n> 1 y m> 1). La longitud de cada cuerda es k [0], k [1], ..., k [m]. ¿Cuál es el producto máximo posible de k [0] xk [1] x ... xk [m]? Por ejemplo, cuando la longitud de la cuerda es 6, la cortamos en tres longitudes de 3 y 3, y el producto máximo obtenido en este momento es 9.
)

Método 1: método dp [longitud]

Calcule el valor máximo de cada dp [longitud]

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

Método 2: Encuentra el método de la ley

La ley de encontrar la solución óptima de varios números enteros más pequeños.
longitud = 0, solución óptima: ninguna, devuelve 0
longitud = 1, solución óptima: ninguna, devuelve 0
longitud = 2, solución óptima: 1 1
longitud = 3, solución óptima: 1 2
longitud = 4, óptima Solución: 2 2
longitud = 5, solución óptima: 3 2
objetivo = 6, solución óptima: 3 3
longitud = 7, solución óptima: 3 2 2
longitud = 8, solución óptima: 3 3 2
objetivo = 9, Solución óptima: 3 3 3
longitud = 10, Solución óptima: 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;
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_42005540/article/details/108299933
Recomendado
Clasificación