diff --git a/paradigm/edit_distance.cpp b/paradigm/edit_distance.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..7f9ef1137a06050805d0f500fb0d58b1731c3a24
--- /dev/null
+++ b/paradigm/edit_distance.cpp
@@ -0,0 +1,30 @@
+/**
+ * Edit Distance 
+ *
+ * Complexity (Time): O(m*n) 
+ * Complexity (Space): O(m*n)
+ */
+
+int edit_distance(string a, string b) {
+  int n = a.size();
+  int m = b.size();
+
+  vector<vector<int>> dp(n+1, vector<int>(m+1));
+
+  for (int i = 0; i <= n; ++i) {
+    for (int j = 0; j <= m; ++j) {
+      if (i == 0)
+        dp[i][j] = j;
+      else if (j == 0)
+        dp[i][j] = i;
+      else if (a[i-1] == b[j-1])
+        dp[i][j] = d[i-1][j-1];
+      else
+        dp[i][j] = 1 + min(dp[i][j-1],     // Insert
+                       min(dp[i-1][j],     // Remove
+                           dp[i-1][j-1])); // Replace
+    }
+  }
+
+  return dp[n][m];
+}
diff --git a/paradigm/lis.cpp b/paradigm/lis.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..48ccd6e83614a7c50c28d46798c8409a2c78a5d7
--- /dev/null
+++ b/paradigm/lis.cpp
@@ -0,0 +1,23 @@
+/**
+ * Longest Increasing Subsequence (LIS) 
+ *
+ * Complexity (Time): O(n^2)
+ * Complexity (Space): O(n)
+ */
+
+int lis(vector<int> v) {
+  int n = v.size();
+
+  vector<int> lis(n);
+  lis[0] = 1;
+
+  for (int i = 1; i < n; ++i) {
+    lis[i] = 1;
+
+    for (int j = 0; j < i; ++j)
+      if (v[i] > v[j] and lis[i] < lis[j] + 1)
+        lis[i] = lis[j] + 1;
+  }
+
+  return *max_element(all(lis));
+}