面試題14:給你一根長度為n的繩子,請把繩子剪成m段(m和n都是整數,n>1並且m>1)每段繩子的長度記為k[0],k[1],...,k[m]. * 請問k[0]*k[1]*...*k[m]可能的最大乘積是多少? * 例如,當繩子的長度為8時,我們把它剪成長度分別為2,3,3的三段,此時得到的最大乘積是18.


 動態規划解法:

package edu.bjtu.day8_27;
/**
 * @author Allen
 * @version 創建時間:2017年9月23日 下午7:00:47
 * 類說明:
 * 面試題14:剪繩子 
 * 題目:給你一根長度為n的繩子,請把繩子剪成m段(m和n都是整數,n>1並且m>1)每段繩子的長度記為k[0],k[1],...,k[m]. 
 * 請問k[0]*k[1]*...*k[m]可能的最大乘積是多少? 
 * 例如,當繩子的長度為8時,我們把它剪成長度分別為2,3,3的三段,此時得到的最大乘積是18. 
 */
public class MaxCutingSolution {
    public static void main(String[] args) {  
        System.out.println(maxCutting(5));  
    }
    public static int maxCutting(int length){  
        if(length<2)  
            return 0;  
        if(length==2)  
            return 1;  
        if(length==3)  
            return 2;
        //子問題的最優解存儲在f數組中,數組中的第i個元素表示把長度為
        ///i的繩子剪成若干段后各段長度乘積的最大值。  
        int[] f = new int[length+1];   
        //這些情況下,不剪的時候長度比剪的時候長,所以作為初始條件
        f[0] = 0; 
        f[1] = 1;  
        f[2] = 2;  
        f[3] = 3;  
        int result = 0;  
        for(int i = 4;i<=length;i++){  
            int max = 0;  
            for(int j = 1;j<=i/2;j++){  
                int num = f[j]*f[i-j];  
                if(max<num)  
                    max = num;  
            }  
            f[i] = max; 
        }  
        result = f[length];  
        return result;  
    }  
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM