Catalan Number: 身高排队算法


身高排队算法-(较优解):12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? - nicebooks的专栏 - 博客频道 - CSDN.NET
12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

这个公式是F(n) = (n! / ((n/2)! * (n/2)!))/ (n/2 +1)).
下面数值表示的是位置,
0   1   2   3   4   5
6   7   8   9 10 11
对于位置0,可能的数的范围是0
对于位置1,可能的数的范围是1,2
对于位置2,可能的数的范围是2,3,4
对于位置3,可能的数的范围是3,4,5,6
对于位置4,可能的数的范围是4,5,6,7,8
对于位置5,可能的数的范围是5,6,7,8,9,10
对于位置为n的数,其数的范围是[n, 2n].

只要从12个人中挑选6个人放在第一排,那么所有的人的位置就都确定了,因为是要求按身高排序的。
这里我们的挑选方法以及限制条件是这样的:12个人先从矮到高排序,然后每个人被选到第一排或者第二排,如果要满足题意,当且仅当每挑选完一次之后,第二排中的人数不多于第一排中的人数,而这个条件的排列就是 C(12,6) - C(12,5) = 132

http://zhangjinkun.com/2015/11/24/5fa521ba1a422e92c24ca6ab88f5c8ae/
同样的情况,从左到右的-1,1序列中的1的个数任何时候都不能比-1 的个数多,否则就是违法的。所以这道题就转化成如下问题:  6组(-1,1)对 进行排列,并且 从左到右遍历,1的个数不能比-1多,这就是一个典型的卡特兰数问题。
-1 1 序列的总个数是:a =  c(2n,n) ,这道题中 n = 6
-1 1 序列中违法的序列总个数是:b =  c(2n,n+1) 
符合条件的序列数就是: c = a – b = c(2n,n) /(n+1) ,结果 c 就是卡特兰数的通式

对于 a 和 b 的解释:
a =  c(2n,n) :  
有12个数字,6个-1,6个1,我们只要在12个空格中随机挑选6个放1,剩下的就自然放-1,所以就是c(12,6)。
b =  c(2n,n+1) :
对于任何一个违法序列,比如:
-1 1 1 -1 -1 -1 1 -1 -1 1 1 1 , 从第三位开始1的个数比-1多,将前三位全部取反,其余不变:

 1 -1 -1 -1 -1 -1 1 -1 -1 1 1 1


那么 -1 的个数就变成了 7,1的个数就变为了 5,仔细思考可以发现对于任何违法序列在进行如上操作后,-1的个数都会变为n+1,而1的个数都会变为n-1,实际上任何一个由 n+1 个-1,n-1个1构成的序列再进行逆反转形成后的 n个-1,n个1的序列都是违法序列,n+1个-1,n-1个1总共可以构成 c(2n,n+1)个序列,他们逆反转后全部是违法序列,互相的关系之间是一一对应的。


综上,总共的合法排序数目就是:
c(2n,n) /(n+1)

  1. public static int countWays(int n) {
  2. n >>= 1;
  3. int res = 1;
  4. for (int i = 2 * n; i > n; i--) {
  5. res *= i;
  6. }
  7. for (int i = 1; i <= n + 1; i++) {
  8. res /= i;
  9. }
  10. return res;
  11. }
Recursive Solution
http://blog.csdn.net/wuzhekai1985/article/details/6713094
假设已按高矮顺序编号从0到11,即0号最矮、11号最高,(i, j)表示某个人在队列中的位置。对于0号只能排在(0, 0),1号可以排在两个位置(0, 1)和(1, 0)。2号可以排的位置取决于1号的位置,如果1号排在(0, 1),那么2号可以排在两个位置(0, 0)和(1, 0)。如果1号排在(1, 0),那么2号只能排在(0, 1)。
观察一下,可以得出一下规律:对于i号,如果第一排与第二排的人数一样,那么他只能排在第一排;如果第一排的人数大于第二排,那么他可以排在第一排或者第二排。递归终止的条件是第一排或第二排排满了
void InLineProblem(int firstFree, int secondFree, int num)
{
 if(firstFree == num/2 || secondFree == num/2) //其中一排无剩余位置
 {
  totalNum++;
  return;
 }
 if(firstFree == secondFree) //第1排人数与第2排人数一样
 {
  InLineProblem(firstFree + 1, secondFree, num); //只能排在第1排
 }
 else
 {
  InLineProblem(firstFree + 1, secondFree, num); //排在第1排
  InLineProblem(firstFree, secondFree + 1, num); //排在第2排
 }
}

http://blog.csdn.net/u011824857/article/details/38794153
分析:这是一个子集树问题,这里的子集指的是站在前排人的集合。
            约束条件:front < 6 && front >= back
            限界条件:back < 6 && front >back

  1.     // 不变信息  
  2.     static int n;  
  3.     // 动态改变信息  
  4.     static int front;// 记录前排的数目  
  5.     static int back;// 记录后排的数目  
  6.     static int count;// 记录解数目  
  7.   
  8.     /** 
  9.      * @author zhangmeng 
  10.      *@param i 表示第i层,此时决定第i+1个人的位置 
  11.      */  
  12.     private static void trackback(int i) {   
  13.         // 更新front  
  14.         if (i < n) {  
  15.             // 如果满足约束条件,搜索左子树  
  16.             if (front < 6 && front >= back) {  
  17.                 // 搜索左子树  
  18.                 front++;  
  19.                 LineUp.trackback(i + 1);  
  20.                 //清理现场  
  21.                 front--;  
  22.             }  
  23.             // 如果 满足上界函数,搜索右子树  
  24.             if (back < 6 && front >back) {  
  25.                 // 更新cx  
  26.                 back++;  
  27.                 trackback(i + 1);  
  28.                 //清理现场  
  29.                 back--;  
  30.             }  
  31.         }else{//处理第n层  
  32.             count++;  
  33.             return;  
  34.         }  
  35.     }  
  36.   
  37.     public static int LineUpCount() {  
  38.         LineUp.n = 12;  
  39.         LineUp.back = 0;  
  40.         LineUp.front = 0;  
  41.         LineUp.count = 0;  
  42.         trackback(0);  
  43.         return LineUp.count;  
  44.     }  
http://onestraw.net/cprogram/12-height-of-different-people/
http://billowkiller.com/blog/2014/08/09/Number-theory-introduction/
Read full article from 身高排队算法-(较优解):12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种? - nicebooks的专栏 - 博客频道 - CSDN.NET

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts