Jianzhiオファー14-I。ロープを切る

Jianzhiオファー14-I。ロープを切る

タイトル説明

ここに画像の説明を挿入

問題解決のアイデア

dp

リファレンスソリューション:動的計画法、数学

この質問は343の変形です。整数分割、公式の質問は明確に説明されています。

時間o(n²)、空間o(n)

class Solution {
    
    
    public int cuttingRope(int n) {
    
    
        //定义:dp[i]表示对于长度为i的绳子,剪成至少两段后可能的最大乘积
        int[] dp = new int[n + 1];
        //base case
        dp[1] = 1;

        for (int i = 2; i <= n; i++) {
    
    
            for (int j = 1; j < i; j++) {
    
    
                //两种选择:每次将 i - j 剪出来后,剩下的 j 的部分选择不剪或继续剪
                dp[i] = Math.max(dp[i], Math.max(j * (i - j), dp[j] * (i - j)));
            }
        }
        return dp[n];
    }
}

数学

結論:分割整数がeに近いほど、積は大きくなります。

ここに画像の説明を挿入
n%3の結果に従ってディスカッションを分類します(m = n / 3と仮定します)

  • n%3 == 0の場合、m3に分割します
  • n%3 == 1の場合、m-13と22に分割します。
  • n%3 == 2の場合、m3と12に分割します。

上記の説明は、n≥4の場合であり、n≤3の場合は適用されないため、個別に説明する必要があります。

  • n = 2の場合、2 = 1 + 1であり、最大積は1です。
  • n = 3の場合、3 = 1 + 1 + 1 = 1 + 2の2つのケースがあり、最大積は2である
    ため、最大積= n-1に組み合わせることができます。

時間o(1)、空間o(1)

ヒント:整数および剰余演算の場合、マシンの数を超えない整数はO(1)と見なすことができます。

class Solution {
    
    
    public int cuttingRope(int n) {
    
    
        if (n <= 3) {
    
    
            return n - 1;
        }
        int quotient = n / 3;
        int remainder = n % 3;
        if (remainder == 0) {
    
    
            return (int)Math.pow(3, quotient);
        } else if (remainder == 1) {
    
    
            return (int)Math.pow(3, quotient - 1) * 4;
        } else {
    
    
            return (int)Math.pow(3, quotient) * 2;
        }
    }
}

おすすめ

転載: blog.csdn.net/cys975900334/article/details/114788138
おすすめ