[Formation de recrue] Offre de doigt d'épée 14. Coupez la corde

Description du titre:

Voici une corde d'une longueur de n. Veuillez couper la corde en m segments de longueur entière (m et n sont des nombres entiers, n> 1 et m> 1). La longueur de chaque corde est k [0], k [1 ] ... k [m-1]. Quel est le produit maximum possible de k [0] k [1] … * k [m-1]? Par exemple, lorsque la longueur de la corde est de 8, nous la coupons en trois morceaux de longueurs de 2, 3 et 3. Le produit maximum obtenu à ce moment est de 18.

Exemple 1:
Entrée: 2
Sortie: 1
Explication: 2 = 1 + 1, 1 × 1 = 1

Exemple 2:
Entrée: 10
Sortie: 36
Explication: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
Astuce:
2 <= n <= 58
Source: LeetCode
Link: https: // leetcode- Le
copyright de cn .com / problèmes / jian-sheng-zi-lcof appartient au réseau Lingkou . Pour les réimpressions commerciales, veuillez contacter l'autorisation officielle. Pour les réimpressions non commerciales, veuillez indiquer la source.

Idées de résolution de problèmes:

Nous supposons qu'il est divisé en m parties, l'exigence de la question est de trouver
MAX (a (1) a (2)a (m)) est
connu, n = a (1) + a (2) +… + a (m)

Alors, lorsque nous interceptons, comment pouvons-nous maximiser la longueur de chaque segment après l'interception?
À partir de l'inégalité de moyenne géométrique arithmétique, nous savons:
Citation des autres

Le produit est le plus grand lorsque nous le divisons en plusieurs segments de même longueur.
Bien sûr, il ne peut pas être divisé en 1 sous-sections.

Alors nous pourrions tout aussi bien supposer que chaque paragraphe est de longueur égale et non égal à 1.

Insérez la description de l'image ici

A travers la preuve ci-dessus, on sait que lorsque l'on coupe une longueur de 3 à chaque fois, le produit final obtenu est le plus gros. Mais la réalité est que nous ne pourrons peut-être pas couper toutes les parties égales à la fin, il y a donc trois situations, c'est-à-dire que le dernier paragraphe est le cas des
longueurs 0, 1 et 2: (1) La longueur est 0 , la situation la plus parfaite, diviser en m petites cordes d'une longueur de 3
(2) La longueur est de 1, tout nombre multiplié par 1 est lui-même et ne deviendra pas plus grand, donc nous pourrions aussi bien combiner 1 avec 3 dans le paragraphe précédent , pour que le produit obtenu soit le plus grand
(3) La longueur est de 2, on ne peut plus le diviser, il suffit de le multiplier.

Remarque: Il s'agit principalement d'une pensée gourmande, à la recherche d'une solution optimale locale à chaque fois.
Je pense que dp peut aussi être écrit, et il sera ajouté plus tard

Code:

public class jianzhi_Offer_14_1 {
    
    
    public int cuttingRope(int n) {
    
    
        if(n == 2){
    
    
            return 1;
        }
        if(n == 3){
    
    
            return 2;
        }
        if (n == 4){
    
    
            return 4;
        }
        int ans = 1;
        int tmp;
        int num = n;
        while (num >= 3){
    
    
            if((num - 3) >= 3){
    
    
                ans *= 3;
                num -= 3;
            }
            else if((num - 3) == 1){
    
    
                ans *= 4;
                num -= 4;
                break;
            }
            else if((num - 3) == 2){
    
    
                ans *= 6;
                num -= 5;
                break;
            }
            else if((num - 3) == 0){
    
    
                ans *= 3;
                num -= 3;
                break;
            }

        }
        return ans;
    }

    public static void main(String[] args) {
    
    
        jianzhi_Offer_14_1 obj = new jianzhi_Offer_14_1();
        System.out.println(obj.cuttingRope(9));
    }
}

Description du titre:

Voici une corde d'une longueur de n. Veuillez couper la corde en m segments de longueur entière (m et n sont des nombres entiers, n> 1 et m> 1). La longueur de chaque corde est k [0], k [1 ] ... k [m-1]. Quel est le produit maximum possible de k [0] k [1] … * k [m-1]? Par exemple, lorsque la longueur de la corde est de 8, nous la coupons en trois morceaux de longueurs de 2, 3 et 3. Le produit maximum obtenu à ce moment est de 18.
La réponse doit être modulo 1e9 + 7 (1000000007). Si le résultat initial du calcul est: 1000000008, veuillez renvoyer 1.

Exemple 1:
Entrée: 2
Sortie: 1
Explication: 2 = 1 + 1, 1 × 1 = 1

Exemple 2:
Entrée: 10
Sortie: 36
Explication: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

Conseil:
2 <= n <= 1000

Source: LeetCode
Lien: https://leetcode-cn.com/problems/jian-sheng-zi-ii-lcof
Copyright est la propriété de LeetCode . Pour les réimpressions commerciales, veuillez contacter l'autorisation officielle. Pour les réimpressions non commerciales, veuillez indiquer la source.

Idées de résolution de problèmes:

La différence entre cette question et la première est que la plage de valeurs de n devient plus grande, ce qui signifie que la réponse finale que nous obtiendrons dépassera la limite maximale que int peut supporter. À ce stade, nous pouvons utiliser la distributivité du reste:
(a * b)% m = ((a% m) * (b% m))% m
plus le reste cyclique pour résoudre le problème. (Parce que, la limite peut être dépassée lors de la multiplication intermédiaire, nous devons donc multiplier pour prendre le reste du résultat)

Code:

public class jianzhi_Offer_14_2 {
    
    
    public int cuttingRope(int n) {
    
    
        int modnum = 1000000007;
        if(n == 2){
    
    
            return 1;
        }
        if(n == 3){
    
    
            return 2;
        }
        if (n == 4){
    
    
            return 4;
        }
        //注意这里要使用long
        long ans = 1;
        int tmp;
        int num = n;
        while (num >= 3){
    
    
            ans = ans % modnum;
            if((num - 3) >= 3){
    
    
                ans = (ans * 3) % modnum;
                num -= 3;
            }
            else if((num - 3) == 1){
    
    
                ans = (ans * 4) % modnum;
                num -= 4;
                break;
            }
            else if((num - 3) == 2){
    
    
                ans = (ans * 6) % modnum;
                num -= 5;
                break;
            }
            else if((num - 3) == 0){
    
    
                ans = (ans * 3) % modnum;
                num -= 3;
                break;
            }

        }
        if( ans == modnum + 1)
            return 1;
        return (int)ans;
    }

    public static void main(String[] args) {
    
    
        jianzhi_Offer_14_2 obj = new jianzhi_Offer_14_2();
        System.out.println(obj.cuttingRope(120));
    }
}

Je suppose que tu aimes

Origine blog.csdn.net/Puppet__/article/details/115076052
conseillé
Classement