diff --git a/dynamicprogramming/java/dynamicprog.iml b/dynamicprogramming/java/dynamicprog.iml
new file mode 100644
index 0000000..9991225
--- /dev/null
+++ b/dynamicprogramming/java/dynamicprog.iml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dynamicprogramming/java/src/com/brainbaking/dynamic/sequencing/LongestCommonSubsequence.java b/dynamicprogramming/java/src/com/brainbaking/dynamic/sequencing/LongestCommonSubsequence.java
new file mode 100644
index 0000000..e0177c6
--- /dev/null
+++ b/dynamicprogramming/java/src/com/brainbaking/dynamic/sequencing/LongestCommonSubsequence.java
@@ -0,0 +1,41 @@
+package com.brainbaking.dynamic.sequencing;
+
+public class LongestCommonSubsequence {
+
+ public String calculate(String a, String b) {
+ int[][] lengths = new int[a.length() + 1][b.length() + 1];
+ char[] as = a.toCharArray();
+ char[] bs = b.toCharArray();
+
+ for(int i = 1; i <= a.length(); i++) {
+ for(int j = 1; j <= b.length(); j++) {
+
+ if(as[i - 1] == bs[j - 1]) {
+ lengths[i][j] = lengths[i - 1][j - 1] + 1;
+ } else {
+ lengths[i][j] = Math.max(lengths[i][j - 1], lengths[i - 1][j]);
+ }
+ }
+ }
+
+ return retrace(lengths, as, as.length, bs.length);
+ }
+
+ private String retrace(int[][] lengths, char[] as, int i, int j) {
+ if(i == 0 || j == 0) return "";
+
+ int l = lengths[i][j];
+ int ltop = lengths[i - 1][j];
+ int lright = lengths[i][j - 1];
+
+ if(ltop == l) {
+ return retrace(lengths, as, i - 1, j);
+ } else if(lright == l) {
+ return retrace(lengths, as, i, j - 1);
+ } else {
+ return retrace(lengths, as, i - 1, j - 1) + as[i - 1];
+ }
+
+ }
+
+}
diff --git a/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/Fiboable.java b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/Fiboable.java
new file mode 100644
index 0000000..d7b6dc5
--- /dev/null
+++ b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/Fiboable.java
@@ -0,0 +1,9 @@
+package com.brianbaking.dynamic.fibo;
+
+import java.util.List;
+
+public interface Fiboable {
+
+ List calculate(int count);
+
+}
diff --git a/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/NaiveFibonacci.java b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/NaiveFibonacci.java
new file mode 100644
index 0000000..6b8e6fe
--- /dev/null
+++ b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/NaiveFibonacci.java
@@ -0,0 +1,19 @@
+package com.brianbaking.dynamic.fibo;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class NaiveFibonacci implements Fiboable {
+
+ public List calculate(int count) {
+ List nrs = new ArrayList<>();
+ nrs.add(0);
+ nrs.add(1);
+
+ for(int i = 2; i <= count; i++) {
+ nrs.add(nrs.get(i - 1) + nrs.get(i - 2));
+ }
+
+ return nrs;
+ }
+}
diff --git a/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/RecursiveFibo.java b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/RecursiveFibo.java
new file mode 100644
index 0000000..c095d1f
--- /dev/null
+++ b/dynamicprogramming/java/src/com/brianbaking/dynamic/fibo/RecursiveFibo.java
@@ -0,0 +1,24 @@
+package com.brianbaking.dynamic.fibo;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Stream;
+
+public class RecursiveFibo implements Fiboable {
+
+ @Override
+ public List calculate(int count) {
+ ArrayList list = new ArrayList<>();
+ list.addAll(Arrays.asList(0, 1));
+ calculateRecursively(2, count, list);
+ return list;
+ }
+
+ private void calculateRecursively(int index, int count, List list) {
+ if(index <= count) {
+ list.add(list.get(index - 1) + list.get(index - 2));
+ calculateRecursively(index + 1, count, list);
+ }
+ }
+}
diff --git a/dynamicprogramming/java/test/com/brainbaking/dynamic/fibo/FibonacciTest.java b/dynamicprogramming/java/test/com/brainbaking/dynamic/fibo/FibonacciTest.java
new file mode 100644
index 0000000..87f9399
--- /dev/null
+++ b/dynamicprogramming/java/test/com/brainbaking/dynamic/fibo/FibonacciTest.java
@@ -0,0 +1,30 @@
+package com.brainbaking.dynamic.fibo;
+
+import com.brianbaking.dynamic.fibo.Fiboable;
+import com.brianbaking.dynamic.fibo.NaiveFibonacci;
+import com.brianbaking.dynamic.fibo.RecursiveFibo;
+import org.junit.Test;
+
+import java.util.stream.Collectors;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class FibonacciTest {
+
+ @Test
+ public void calculateNaive() {
+ testFibo(new NaiveFibonacci());
+ }
+
+ @Test
+ public void calculateRecursively() {
+ testFibo(new RecursiveFibo());
+ }
+
+ private void testFibo(Fiboable fibo) {
+ String result = fibo.calculate(10).stream().map(i -> i.toString()).collect(Collectors.joining(","));
+
+ assertEquals("0,1,1,2,3,5,8,13,21,34,55", result);
+ }
+
+}
diff --git a/dynamicprogramming/java/test/com/brainbaking/dynamic/sequencing/LongestCommonSubsequenceTest.java b/dynamicprogramming/java/test/com/brainbaking/dynamic/sequencing/LongestCommonSubsequenceTest.java
new file mode 100644
index 0000000..274f5a3
--- /dev/null
+++ b/dynamicprogramming/java/test/com/brainbaking/dynamic/sequencing/LongestCommonSubsequenceTest.java
@@ -0,0 +1,18 @@
+package com.brainbaking.dynamic.sequencing;
+
+import org.junit.Test;
+
+import static junit.framework.TestCase.assertEquals;
+
+public class LongestCommonSubsequenceTest {
+
+ @Test
+ public void longestCommonSubSequence() {
+ LongestCommonSubsequence sequencer = new LongestCommonSubsequence();
+
+ String result = sequencer.calculate("ABCBDAB", "BDCABA");
+
+ assertEquals("BCBA", result);
+ }
+
+}