算法回忆录:母函数解决整数拆分 - xhpakill - SegmentFault



算法回忆录:母函数解决整数拆分 - xhpakill - SegmentFault

省略了很多内容,所以需要一定基础才可阅读。主要为了说清母函数如何解决此问题。
整数拆分:
1、整数拆分可以理解为苹果放盘子问题(把N个苹果放在M个盘子里有多少种方法),只是这是相当于把N个苹果放在N个盘子里而已。
代码:

int zh(int n,int m) { if(n==1 || m==1) return 1; if(n <= m) return (1 + zh(n, n-1)); return zh(n, m-1) + zh(n-m, m); }

2、整数拆分同样可以用递推解决,其实这同样用到了递归所得的关键函数关系: f(n, m) = f(n, m-1) + f(n-m, m)。

for(int i=1; i<=n; i++) { for(int j=1; j<=n;j ++){ if(i <= j){ ans[j] += ans[j-i]; } } }

3、用母函数解决: 这才是本文的关键。
a、首先要理解为什么整数拆分可以用G(x)=(1+x+x^2+x^3+x^4+……)(1+x^2+x^4+x^6)(1+x^3+x^6+x^9+……)(1+x^4+x^8+x^12+……)……表示。这个可以这样理解:第一项可以理解为用1来拆分,假使要求x^7的系数,那么第一个多项式中的x^7就是由7个x相乘得出的(7=1+1+1+1+1+1+1),除此之外第一个多项x^2可以与后面的多项式中的x^5相乘得出,这个可以理解为7=1+1+5。但是第2项的表达式中x^2*后项中x^5就是7=2+5。这个逻辑必须理解,这是G(x)解决整数拆分的关键思想。
b、如何理解代码? 循环的控制很难理解:但是大体可以这样解释:显然c1存储变量,c2为临时变量;执行一次i循环,c2则表示乘到当前多项式x的n次幂的系数为c2【n】,然后c2赋值到c1,c2初始化,继续执行。

while (cin>>n) { for (i=0; i<=n; i++) { c1[i]=0; c2[i]=0; } for (i=0; i<=n; i++) c1[i]=1; for (i=2; i<=n; i++) { //key code for (j=0; j<=n; j++) { for (k=0; k+j<=n; k+=i) { c2[j+k] += c1[j]; } } for (j=0; j<=n; j++) { c1[j] = c2[j]; c2[j] = 0; } } cout<< c1[n] <<endl;

Read full article from 算法回忆录:母函数解决整数拆分 - xhpakill - SegmentFault


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts