劍指 Offer 14- II. 剪繩子 II + 貪心 + 數論 + 快速冪
阿新 • • 發佈:2020-12-10
劍指 Offer 14- II. 剪繩子 II
題目連結
因為有取模的操作,動態規劃中max不能用了,我們觀察:正整數從1開始,但是1不能拆分成兩個正整數之和,所以不能當輸入。
2只能拆成 1+1,所以乘積也為1。
數字3可以拆分成 2+1 或 1+1+1,顯然第一種拆分方法乘積大為2。
數字4拆成 2+2,乘積最大,為4。
數字5拆成 3+2,乘積最大,為6。
數字6拆成 3+3,乘積最大,為9。
數字7拆為 3+4,乘積最大,為 12。
數字8拆為 3+3+2,乘積最大,為 18。
數字9拆為 3+3+3,乘積最大,為 27。
數字10拆為 3+3+4,乘積最大,為 36。
那麼通過觀察上面的規律,我們可以看出從5開始,數字都需要先拆出所有的3,一直拆到剩下一個數為2或者4,因為剩4就不用再拆了,拆成兩個2和不拆沒有意義,而且4不能拆出一個3剩一個1,這樣會比拆成 2+2 的乘積小。
package com.walegarrett.offer; /** * @Author WaleGarrett * @Date 2020/12/10 18:56 */ public class Offer_14_2 { public int cuttingRope(int n) { if(n ==2 || n == 3) return n-1; long ans = 1; while(n > 4){ ans = ans * 3 % 1000000007; n -= 3; } return (int)((ans * n) % 1000000007); } }