Algorithms

algorithms4DynamicProgramming

Path
pkg4algorithms/algorithms4DynamicProgramming.java
Package
pkg4algorithms
Study order
4
Run
Single-file source launch
Command
java pkg4algorithms/algorithms4DynamicProgramming.java

There is no in-browser runner. This is the file from the curriculum, unchanged.

pkg4algorithms/algorithms4DynamicProgramming.java
1package pkg4algorithms;2 3/*4 * algorithms4DynamicProgramming.java5 * -----------------------6 * DP = solve overlapping subproblems once and reuse (memoization / tabulation).7 * Two requirements: optimal substructure + overlapping subproblems.8 *9 * Covered: Fibonacci, 0/1 knapsack, LCS, coin change (min coins), LIS, edit distance.10 */11import java.util.*;12 13public class algorithms4DynamicProgramming {14 15    // Fibonacci - bottom-up, O(n) time O(1) space16    static long fib(int n) {17        if (n < 2) return n;18        long a = 0, b = 1;19        for (int i = 2; i <= n; i++) { long c = a + b; a = b; b = c; }20        return b;21    }22 23    // 0/1 Knapsack - max value within capacity, O(n*W)24    static int knapsack(int W, int[] wt, int[] val) {25        int n = wt.length;26        int[][] dp = new int[n + 1][W + 1];27        for (int i = 1; i <= n; i++)28            for (int w = 0; w <= W; w++) {29                dp[i][w] = dp[i - 1][w];                        // skip item i30                if (wt[i - 1] <= w)                             // take item i31                    dp[i][w] = Math.max(dp[i][w], val[i - 1] + dp[i - 1][w - wt[i - 1]]);32            }33        return dp[n][W];34    }35 36    // Longest Common Subsequence, O(m*n)37    static int lcs(String a, String b) {38        int m = a.length(), n = b.length();39        int[][] dp = new int[m + 1][n + 1];40        for (int i = 1; i <= m; i++)41            for (int j = 1; j <= n; j++)42                dp[i][j] = a.charAt(i - 1) == b.charAt(j - 1)43                        ? dp[i - 1][j - 1] + 144                        : Math.max(dp[i - 1][j], dp[i][j - 1]);45        return dp[m][n];46    }47 48    // Coin change - minimum number of coins for amount (DP), O(amount*coins)49    static int coinChangeMin(int amount, int[] coins) {50        int[] dp = new int[amount + 1];51        Arrays.fill(dp, amount + 1);52        dp[0] = 0;53        for (int a = 1; a <= amount; a++)54            for (int c : coins)55                if (c <= a) dp[a] = Math.min(dp[a], dp[a - c] + 1);56        return dp[amount] > amount ? -1 : dp[amount];57    }58 59    // Longest Increasing Subsequence, O(n^2) (O(n log n) version possible)60    static int lis(int[] nums) {61        if (nums.length == 0) return 0;62        int[] dp = new int[nums.length];63        Arrays.fill(dp, 1);64        int best = 1;65        for (int i = 1; i < nums.length; i++)66            for (int j = 0; j < i; j++)67                if (nums[j] < nums[i]) { dp[i] = Math.max(dp[i], dp[j] + 1); best = Math.max(best, dp[i]); }68        return best;69    }70 71    // Edit (Levenshtein) distance, O(m*n)72    static int editDistance(String a, String b) {73        int m = a.length(), n = b.length();74        int[][] dp = new int[m + 1][n + 1];75        for (int i = 0; i <= m; i++) dp[i][0] = i;76        for (int j = 0; j <= n; j++) dp[0][j] = j;77        for (int i = 1; i <= m; i++)78            for (int j = 1; j <= n; j++)79                dp[i][j] = a.charAt(i - 1) == b.charAt(j - 1)80                        ? dp[i - 1][j - 1]81                        : 1 + Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1]));82        return dp[m][n];83    }84 85    public static void main(String[] args) {86        System.out.println("fib(40) = " + fib(40));87        System.out.println("knapsack = " + knapsack(50, new int[]{10, 20, 30}, new int[]{60, 100, 120}));88        System.out.println("lcs(ABCBDAB, BDCAB) = " + lcs("ABCBDAB", "BDCAB"));89        System.out.println("coinChangeMin(11, {1,2,5}) = " + coinChangeMin(11, new int[]{1, 2, 5}));90        System.out.println("lis([10,9,2,5,3,7,101,18]) = " + lis(new int[]{10, 9, 2, 5, 3, 7, 101, 18}));91        System.out.println("editDistance(horse, ros) = " + editDistance("horse", "ros"));92    }93}