1. 程式人生 > >Integer Break

Integer Break

Given a positive integer n, break it into the sum of at least two positive integers and maximize the product of those integers. Return the maximum product you can get.

For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4).

Note: you may assume that n is not less than 2.

思路: 用f[i] 來表示i被分隔成正整數後,那些正整數的乘積。
那麼f[2]=1 (2=1+1)
f[3] =2 ( 3=1*2 ) 注意 2和3 不分的話,自己本身比分隔後的乘積更加大

先檢視一下規律
4可以分為1+3和2+2,則f[4]為1*3和2*2中比較大的一個,即f[4]=2*2=4
5=1+4=2+3 則f[5]為f(1)*f[4] 和2*3 中比較大的一個,即f[5]=2*3=6
6=1+5=2+4=3+3,同理f[6]=3*3=9;

依次類推
f[7]=1+6=2+5=3+4 f[7]=3*f[4]=3*2*2

可以發現 f[i]可以分隔為x個2和y個3相加,而動態規劃的思想就是根據目前已經有的結論推出下一個的值,假設我要計算f[i],並且目前為止f[1]至f[i-1]都是已經計算出來的,那怎麼推出f[i]呢,從前面的規律中我們可以發現,計算f[i]的值都是有x個2和y個3相乘,那麼說明f[i] 可以由2*f[i-2] 和3*f[i-3]計算得出,即f[i]的值為2*f[i-1]和3*f[i-3]中比較大的。

那麼可以得出結論

f[i] = Max( 2*f[i-2] , 3*f[i-3] )

其中雖然f[2]=1 和f[3] =2 ,但是要注意計算f[i]的時候2和3可以不用分隔,
比如按照公式 f[5] =Max(2*f[3] , 3*f[2] ) 注意由於 2和3 不分的話,自己本身比分隔後的乘積更加大,所以f[5]應該等於 Max(2*3 ,3*2)

public class Solution {
    public int integerBreak(int n) {
        if(n<2) 
           return -1;
        if(n==2
) return 1; int[] f = new int[n+1]; f[2]=1; f[3]=2; for(int i=4;i<=n;i++) { int temp2 = Math.max(i-2,f[i-2]); int temp3 = Math.max(i-3,f[i-3]); f[i]=Math.max(2*temp2,3*temp3); } return f[n]; } }