問題の説明:
長さ n のロープが与えられた場合、ロープを整数の長さの m 個のセグメントに切断してください (m と n は両方とも整数、n>1 および m>1)。各ロープの長さは k[0],k [ 1]...k[m-1] 。k[0] k[1]*...*k[m-1] の積の最大値は何ですか? たとえば、ロープの長さが 8 の場合、長さが 2、3、3 の 3 つの部分に切断します。このとき得られる最大の製品は 18 です。
答えはモジュロ 1e9+7 (1000000007) である必要があります。最初の計算結果が 1000000008 の場合は、1 を返してください。
例:
输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1
输入: 10 输出: 36 解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
問題解決のアイデア:
貪欲な考え
ロープを 3 つの等しい長さに切断すると、得られる製品が最大になります。アイデアを結び付けて導き出すことができる一連の数学理論があります
手順は次のとおりです。
- n == 2 の場合は 1 を返し、n == 3 の場合は 2 を返し、この 2 つを結合して n が 4 より小さい場合は n - 1 を返します。
- n == 4 の場合は 4 を返します。
- n > 4 の場合、長さ 3 のできるだけ多くの小さなセグメントに分割し、各ループの長さ n から 3 を減算し、積 res に 3 を乗算し、戻るときにそれに 4 以下を乗算します。
- 最後の段落; 各乗算演算の後に剰余を取ることを忘れないでください。
- 上記2と3は組み合わせることができます。
コード
class Solution {
public int cuttingRope(int n) {
if(n < 4){
return n - 1;
}
if(n == 4){
return n;
}
long res = 1;
while(n > 4){
//取余数
res = res * 3 % 1000000007;
n -= 3;
}
return (int)(res * n % 1000000007);
}
}