劍指offer--剪繩子,動態規劃

今日學了思路,待補充算法

題目:數組

將長度爲n的繩子剪成若干段,並求各段長度乘積的最大值。學習

思路:spa

 一、動態規劃
    設f(n)表明長度爲n的繩子剪成若干段的最大乘積,若是第一刀下去,第一段長度是i,那麼剩下的就須要剪n-i,那麼f(n)=max{f(i)f(n-i)}。而f(n)的最優解對應着f(i)和f(n-i)的最優解,假如f(i)不是最優解,那麼其最優解和f(n-i)乘積確定大於f(n)的最優解,和f(n)達到最優解矛盾,因此f(n)的最優解對應着f(i)和f(n-i)的最優解。首先,剪繩子是最優解問題,其次,大問題包含小問題,而且大問題的最優解包含着小問題的最優解,因此可使用動態規劃求解問題,而且從小到大求解,把小問題的最優解記錄在數組中,求大問題最優解時就能夠直接獲取,避免重複計算。
    n<2時,因爲每次至少減一次,因此返回0。n=2時,只能剪成兩個1,那麼返回1。n=3時,能夠剪成3個1,或者1和2,那麼最大乘積是2。當n>3時,就可使用公式進行求解。
    f(4)=max{f(1)f(3), f(2)f(2)}
    f(5)=max{f(1)f(4), f(2)f(3)}
    ...
    f(n)=max{f(1)f(n-1), f(2)f(n-2), f(3)f(n-3), ..., f(i)(fn-i), ...}
    由於須要保證f(i)f(n-i)不重複,就須要保證i<=n/2,這是一個限制條件,求1~n/2範圍內的乘積,獲得最大值
 二、貪心算法
    n<2時,返回0;n=2時,返回1;n=3時,返回2
    根據數學計算,當n>=5時,2(n-2)>n,3(n-3)>n,這就是說,將繩子剪成2和(n-2)或者剪成3和(n-3)時,乘積大於不剪的乘積,所以須要把繩子剪成2或者3。而且3(n-3)>=2(n-2),也就是說,當n>=5時,應該剪儘可能多的3,可使最後的乘積最大。對於長度是n的繩子,咱們能夠剪出n/3個3,剩餘長度是1或者2,若是餘數是1,就能夠把1和最後一個3合併成4,那麼4剪出兩個2獲得的乘積是4,比1*3大,所以這種狀況下,須要將3的個數減小1,變成兩個2;若是餘數是2,那麼無需作修改。
    能夠獲得最大的乘積是:3^timesOf3 * 2^timesOf2
    相比動態規劃,計算更簡便,可是須要必定的數學技巧。
原文:https://blog.csdn.net/upupday19/article/details/79315885

.net

動態規劃+貪婪code

https://blog.csdn.net/upupday19/article/details/79315885blog

 1 public class Cut_string {
 2     public static void main(String[] args) {
 3         System.out.println(maxAfterCutting(8));
 4         }
 5     //須要O(n^2)的時間複雜度和O(n)的空間複雜度的動態規劃思路
 6     public static int maxAfterCutting(int length) {
 7         if(length<2)
 8             return 0;
 9         if(length==2)
10             return 1;
11         if(length==3)
12             return 2;
13         //子問題的最優解存儲在F數組中,數組中第i個元素表示將長度爲i的繩子剪成若干段
14         int [] f = new int[length+1];
15         f[0]=0;
16         f[1]=1;
17         f[2]=2;
18         f[3]=3;
19         int result = 0;
20         for(int i = 4;i<=length;++i) {
21             int max = 0;
22             for(int j = 1;j<=i/2;++j) {
23                 int num = f[j]*f[i-j];
24                 if(max<num)
25                     max=num;
26                 f[i] = max;
27             }
28         }
29         result = f[length];
30         return result;    
31     }
32 }

 有待繼續學習。get

相關文章
相關標籤/搜索