Skip to content

Dynamic Programming Problems

Praveen Kumar Anwla edited this page Dec 23, 2023 · 59 revisions

Q1. Find the subset of numbers from a list which sum up to N.

Ans:

def subset_sum(M, nums):
    
    DP = [[False for _ in range(M+1)] for _ in range(len(nums)+1)]
    
    #Initialize the first row and colum to be True
    for i in range(len(nums)+1):
        DP[i][0] = True
    
    #Construct the rest of the table
 
    for i in range(1, len(nums)+1):
        for j in range(1, M+1):
                
            if j < nums[i-1]:   # if local sum value is less than the previous item
                DP[i][j] = DP[i-1][j]  # Don't include the item
                
            else:  # if local sum value is not less than the previous item
                if DP[i-1][j]:  # If previous cell value is True
                    DP[i][j] = DP[i-1][j]
                else:
                    DP[i][j] = DP[i-1][j-nums[i-1]]

    # Get the subset values which sum upto the desired sum.
    j = M
    i = len(nums)
    while i > 0 or j > 0:

        if DP[i][j] == DP[i-1][j]:  # If current cell item is same as above cell item. 
            i = i-1
        else:
            print('item for the subset: %d' % nums[i - 1])
            j = j-nums[i-1]  # Decrement the column index by actual integer, and decrement the row index by 1.
            i = i-1
        
                
M = 12
nums = [1, 2, 4, 6]

subset_sum(M, nums)

Q2. Find the longest common subsequence between two strings.

Ans:

def longest_common_subseq(s1, s2):
    
    DP = [[0 for _ in range(len(s1)+1)] for _ in range(len(s2)+1)]

    for i in range(len(s1)):
        DP[i][0] = 0

    # Construct the table
    for i in range(1, len(s1)+1):
        for j in range(1, len(s2)+1):
            
            if s1[i-1] == s2[j-1]: # if chars are matching
                DP[i][j] = DP[i-1][j-1]+1
            else:  
                DP[i][j] = max(DP[i-1][j], DP[i][j-1])
                
    # Retrieve the longest common subsequence
    lcs = ''
    i, j = len(s1), len(s2)
    
    while i > 0 or j > 0:
        if s1[i-1] == s2[j-1]:  # if chars are matching then char is part of lcs
            lcs += s1[i-1]
            
            # Got to diagonal cell
            i -= 1
            j -= 1
        
        # if chars are not matching then find larger of 2 cells and go one step in direction of larger one
        elif DP[i-1][j] > DP[i][j-1]:  # top cell value > left cell value 
            i -= 1  # go up
        else:  # left cell value > top cell value 
            
            j -= 1  # go down
            
    return print(lcs[::-1])
     
            
s1 = "ABCD"
s2 = "ACDF"


longest_common_subseq(s1, s2)
Clone this wiki locally