longest subsequence problem code example

Example 1: longest common subsequence

class Solution:
    def longestCommonSubsequence(self, text1: str, text2: str) -> int:
        """
        text1: horizontally
        text2: vertically
        """
        dp = [[0 for _ in range(len(text1)+1)] for _ in range(len(text2)+1)]
        
        for row in range(1, len(text2)+1):
            for col in range(1, len(text1)+1):
                if text2[row-1]==text1[col-1]:
                    dp[row][col] = 1+ dp[row-1][col-1]
                else:
                    dp[row][col] = max(dp[row-1][col], dp[row][col-1])
        return dp[len(text2)][len(text1)]

Example 2: longest common subsequence

int maxSubsequenceSubstring(char x[], char y[], 
                            int n, int m) 
{ 
    int dp[MAX][MAX]; 
  
    // Initialize the dp[][] to 0. 
    for (int i = 0; i <= m; i++) 
        for (int j = 0; j <= n; j++) 
            dp[i][j] = 0; 
  
    // Calculating value for each element. 
    for (int i = 1; i <= m; i++) { 
        for (int j = 1; j <= n; j++) { 
  
            // If alphabet of string X and Y are 
            // equal make dp[i][j] = 1 + dp[i-1][j-1] 
            if (x[j - 1] == y[i - 1]) 
                dp[i][j] = 1 + dp[i - 1][j - 1]; 
  
            // Else copy the previous value in the 
            // row i.e dp[i-1][j-1] 
            else
                dp[i][j] = dp[i][j - 1]; 
        } 
    } 
  
    // Finding the maximum length. 
    int ans = 0; 
    for (int i = 1; i <= m; i++) 
        ans = max(ans, dp[i][n]); 
  
    return ans; 
}

Example 3: longest increasing subsequence techie delight

#include <iostream>
#include <vector>
using namespace std;
 
// Iterative function to find longest increasing subsequence
// of given array
void findLIS(int arr[], int n)
{
    // LIS[i] stores the longest increasing subsequence of subarray
    // arr[0..i] that ends with arr[i]
    vector<int> LIS[n];
 
    // LIS[0] denotes longest increasing subsequence ending with arr[0]
    LIS[0].push_back(arr[0]);
 
    // start from second element in the array
    for (int i = 1; i < n; i++)
    {
        // do for each element in subarray arr[0..i-1]
        for (int j = 0; j < i; j++)
        {
            // find longest increasing subsequence that ends with arr[j]
            // where arr[j] is less than the current element arr[i]
 
            if (arr[j] < arr[i] && LIS[j].size() > LIS[i].size())
                LIS[i] = LIS[j];
        }
 
        // include arr[i] in LIS[i]
        LIS[i].push_back(arr[i]);
    }
 
    // uncomment below lines to print contents of vector LIS
    /* for (int i = 0; i < n; i++)
    {
        cout << "LIS[" << i << "] - ";
        for (int j : LIS[i])
            cout << j << " ";
        cout << endl;
    } */
 
    // j will contain index of LIS
    int j;
    for (int i = 0; i < n; i++)
        if (LIS[j].size() < LIS[i].size())
            j = i;
 
    // print LIS
    for (int i : LIS[j])
        cout << i << " ";
}
 
int main()
{
    int arr[] = { 0, 8, 4, 12, 2, 10, 6, 14, 1, 9, 5, 13, 3, 11, 7, 15 };
    int n = sizeof(arr)/sizeof(arr[0]);
 
    findLIS(arr, n);
 
    return 0;
}

Tags:

Cpp Example