Probability Of Alive On Island | N00tc0d3r


Probability Of Alive On Island | N00tc0d3r
There is an island which is represented by square matrix NxN, represented as (0,0) to (N-1,N-1).
A person on the island is standing at given coordinates (x,y). He can move in any direction one step, right, left, up, down on the island. If he steps outside the island, he dies.

Now He is allowed to move n steps on the island (along the matrix). What is the probability that he is alive after he walks n steps on the island?
Write an efficient full code and tests for function double probabilityOfAlive(int x,int y, int n).
Prob(x, y, step) = 0.25*Prob(x-1, y, step-1) + 0.25*Prob(x, y-1, step-1)
                            + 0.25*Prob(x+1, y, step-1) + 0.25*Prob(x, y+1, step-1)

Solution - Recursion

This problem is similar to the Edit Distance problem we discussed before.

Let's start from a island of size 1x1. Since one step towards any direction will get out of the island, the probability to alive is 0.

Given a island of 3x3 and let's stand at (1,1) which is the center of the island. There are four possibilities and assume the probability of each is the same, 0.25. Walking one step towards any direction will end at a spot on the island. So the probability of alive is (1+1+1+1)/4 = 1.

Now let's stand at (0,1). Walking up one step will get out of the island! So the probability of alive is (0+1+1+1)/4 = 0.75.

Generalizing the formula, we have:
Prob(x, y, step) = 0.25*Prob(x-1, y, step-1) + 0.25*Prob(x, y-1, step-1)
                            + 0.25*Prob(x+1, y, step-1) + 0.25*Prob(x, y+1, step-1)
   public static double probabilityOfAlive(int x,int y, int step, int n) {  
     if (x<0 || y<0 || x>=n || y>=n) return 0;  
     if (step == 0) return 1;  
     return 0.25*probabilityOfAlive(x-1, y, step-1, n)  
         + 0.25*probabilityOfAlive(x, y-1, step-1, n)  
         + 0.25*probabilityOfAlive(x+1, y, step-1, n)  
         + 0.25*probabilityOfAlive(x, y+1, step-1, n);  
   }  


Solution - DP
   public static double probabilityOfAlive(int x,int y, int step, int n) {  
     if (x<0 || y<0 || x>=n || y>=n || (n==1 && step==1)) return 0;  
     if (step == 0) return 1;  
     double[][][] probTable = new double[n][n][2];  
     int sp = 0;  
     // init for step=1  
     for (int i=0; i<n; ++i) {  
       for (int j=0; j<n; ++j) {  
         probTable[i][j][sp] = 0;  
         if (i>0) probTable[i][j][sp] += 0.25;  
         if (j>0) probTable[i][j][sp] += 0.25;  
         if (i+1<n) probTable[i][j][sp] += 0.25;  
         if (j+1<n) probTable[i][j][sp] += 0.25;  
       }  
     }  
     // calculate with DP  
     while (sp < (step-1)) {  
       int pre = sp++;  
       for (int i=0; i<n; ++i) {  
         for (int j=0; j<n; ++j) {  
           probTable[i][j][sp&1] = 0;  
           if (i>0) probTable[i][j][sp&1] += 0.25*probTable[i-1][j][pre&1];  
           if (j>0) probTable[i][j][sp&1] += 0.25*probTable[i][j-1][pre&1];  
           if (i+1<n) probTable[i][j][sp&1] += 0.25*probTable[i+1][j][pre&1];  
           if (j+1<n) probTable[i][j][sp&1] += 0.25*probTable[i][j+1][pre&1];  
           if (sp==step-1 && i==x && j==y) return probTable[x][y][sp&1];  
         }  
       }  
     }  
     return probTable[x][y][sp&1];  
   }  

Recall that in Edit Distance problem, we only use a table of two rows to store the values.
Here we can reduce some spaces too.
Since the table is symmetric, we only need 1/4 of table and a lookup method that can map (i, j) to correct spot in the shrinked table.
http://www.careercup.com/question?id=15556758
http://stackoverflow.com/questions/16522296/probability-of-death-of-a-man-moving-n-steps-in-a-matrix
https://www.techiedelight.com/probability-alive-after-taking-n-steps-island/
float aliveProbability(int x, int y, int n, map<string, float> &dp)
{
    // base case
    if (n == 0)
        return 1.0;
    // calculate unique map key from current coordinates(x, y) of person
    // and number of steps(n) left
    string key = to_string(x) + "|" + to_string(y) + "|" + to_string(n);
    
    // if sub-problem is seen for the first time
    if (dp.find(key) == dp.end())
    {
        float p = 0.0;
        // move one step up
        if (x > 0)
            p += 0.25 * aliveProbability(x - 1, y, n - 1, dp);
        // move one step down
        if (x < N - 1)
            p += 0.25 * aliveProbability(x + 1, y, n - 1, dp);
        // move one step left
        if (y > 0)
            p += 0.25 * aliveProbability(x, y - 1, n - 1, dp);
        // move one step right
        if (y < N - 1)
            p += 0.25 * aliveProbability(x, y + 1, n - 1, dp);
        dp[key] = p;
    }
    return dp[key];
}


Prob(x, y, step) = 0.25*Prob(x-1, y, step-1) + 0.25*Prob(x, y-1, step-1)

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