Bottom Up (Tabulation)
import java.util.Arrays;
public int fn(int[] arr) { if (BASE_CASE) { return 0; }
int[] dp = new int[STATE_FOR_WHOLE_INPUT + 1]; Arrays.fill(dp, BASE_CASE);
for (int STATE = SMALLEST_SUBPROBLEM; STATE <= STATE_FOR_WHOLE_INPUT; STATE++) { if (BASE_CASE) { dp[STATE] = BASE_CASE; } else { dp[STATE] = RECURRENCE_RELATION(STATE); } }
return dp[STATE_FOR_WHOLE_INPUT];}Kadane’s Algorithm
public int kadane(int[] arr) { int currSub = arr[0]; int maxSub = arr[0];
for (int i = 1; i < arr.length; i++) { currSub = Math.max(currSub + arr[i], arr[i]); maxSub = Math.max(maxSub, currSub); }
return maxSub;}Top Down (Memoization)
import java.util.HashMap;import java.util.Map;
Map<STATE, Integer> memo = new HashMap<>();
public int fn(int[] arr) { return dp(STATE_FOR_WHOLE_INPUT, arr);}
public int dp(STATE, int[] arr) { if (BASE_CASE) { return 0; }
if (memo.contains(STATE)) { return memo.get(STATE); }
int ans = RECURRENCE_RELATION(STATE); memo.put(STATE, ans); return ans;}