一,問題描述
給定若干個字元,求解 這些字元能夠表示的最多組合個數。比如 一共有七種組合。(每種組合沒有重複的字元 且 組合的種數與順序無關,如 ab 和 ba 是同一種組合)
a、b 、c 、ab 、ac 、bc 、abc
其實,求組合個數,可以用公式來求解:具給定 n種字元,一共有 c(n,1)+c(n,2)+...+c(n,n)種不同的組合。其中,c(n,i)表示:從n個字元中任選 i 個的組合數,數學表示為:c in。
二,dp演算法思路
既然已經可以用上面的公式 c(n,1)+c(n,2)+...+c(n,n) 來計算不同的組合數了,那為什麼還用dp?因為,上面的公式只能給定組合數,但是不能給出具體是哪些組合。
假設輸入 m 個字元(互不相同),則這些字元只能構成長度為 1,2,....m 的組合,設某個組合的長度為 n。即: 1 =< n <= m
設 c[m][n] 表示 使用 m 種不同的字元,表示長度最多為 n 的組合個數 的最大值。
最大值體現了最優子問題性質。最優子問題分析如下:把字元組合分成兩部分,第乙個字元 以及剩下的所有字元。
對於第 m 種字元而言,只有兩種情況:①是字元組合的第乙個字元,②不是在字元組合的第乙個字元。因此,可以應用《組合數學》中的加法原理。(比如 'abc' 就是乙個字元組合)
c[m][n]=c[m-1][n-1] + c[m-1][n]
c[m-1][n-1],表示第 m 個字元是字元組合中的第乙個字元。此時,該問題變成:用 1,2,...m-1個字元(共 m-1 種) 來 組合 長度為 n-1的 字元組合(『字串』)
c[m-1][n],表示第 m 個字元不是字元組合中的第乙個字元。此時,該問題變成:在剩餘的 m-1種字元裡面選出 n 個字元來組合。???(有點不太對)
'm' ? ? .... ? 第乙個字元是 'm'
'*' ? ? .....? 第乙個字元不是 'm'
注意,原問題表示的字元組合 長度是 n
這個問題的dp求解與 動態規劃求解最多有幾種方案求解硬幣找零問題 非常相似。
同時,這也是乙個典型的加法原理的應用。
三,**實現
public class allcomposite對於初始條件的確定,可以先畫乙個小的示例圖來確定。比如:allcombination(, 3)......public static int dpallcombination(char str, int n)
//c[n][n]=c[n-1][m-1] + c[n-1][m]
for(int i = 1; i <=n; i++)
}return c[n][n];
}public static void main(string args) ;
int m ,n ;
m = n = str.length;
int result = allcombination(str, m, n);
int result2 = dpallcombination(str, n);
system.out.println(result);
system.out.println(result2);}}
在**裡面 記錄下具體選了哪些字元,就可以列印輸出具有的字元組合了。其實我也不會。
時間複雜度分析:從上面的遞迴方法來看:遞迴表示式為 t(m)=2t(m-1),得出:t(m)=2^m ,指數級複雜度
而從上面的動態規劃求解方法來看:時間複雜度為o(m^2)
原因就是:這個問題存在重疊的子問題,對於dp而言,不需要重複地計算某些值,而是通過查詢求得。這篇文章 求解兩個字串的最長公共子串行 詳細分析了dp的優勢在**。
(動態規劃的兩個基本特徵:①最優子結構;②重疊子問題)
動態規劃問題之求組合數
我們知道,組合數在組合數學中非常有用,組合數是乙個十分常用的數字。比如,書架上有4本書abcd,我們想拿2本讀,那麼有c 4,2 種方法。這個數字的求法是 4!2!4 2 其中n!1 2 3.n,是階乘數。所以按定義求其實也十分 容易 這裡是指容易寫罷了。先求乙個階乘 def fac n if n ...
leetcode 62 組合數 動態規劃
解法一 組合數 一共有m 1和n 1種向下或向右的走法,用組合數排序 from math import factorial class solution def uniquepaths self,m int,n int int return int factorial m n 2 factorial...
演算法題討論 超大組合數的求解
題目 是一場筆試,第一次筆試慌慌張張,考場中並沒有做出來。以上不表。直接看題 兩個人小王和小李玩石頭剪刀布的遊戲。一共玩n次。小王贏一次的乙份,輸了不扣分。如果小王得到s分,且已知小李出拳順序,求小王可能的出拳組合總數。輸入 遊戲場數n,小王遊戲得分s,小李的出拳順序陣列p 在陣列p中,0代表石頭,...