Kali_prasad

uber oa - even sum paths

Dec 4th, 2025
30
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.38 KB | None | 0 0
  1. '''
  2. A20251204_uberOA
  3.  
  4.  
  5. given you a matrix of  m*n rows all positive integers
  6. task is to find the number of even sum paths from 0,0 to m-1,n-1
  7. you can only move down or right at any point in time
  8.  
  9. ------------------------------------------------------------------------------------------------------
  10. important thing to be noted here is -
  11.  
  12. you know
  13.  
  14. e+e = e
  15. o+o = e
  16. e+o = o
  17.  
  18. cool
  19. using this
  20. you can simply solve this with dp
  21. say
  22. if curr is odd
  23. dp[i][j][o] = dp[i-1][j][e] + dp[i][j-1][e]
  24. dp[i][j][e] = dp[i-1][j][o] + dp[i][j-1][o]
  25.  
  26. if curr is even
  27. dp[i][j][o] = dp[i-1][j][o] + dp[i][j-1][o]
  28. dp[i][j][e] = dp[i-1][j][e] + dp[i][j-1][e]
  29.  
  30. that's it problem solved
  31. return the final ans at m-1 and n-1
  32.  
  33.  
  34. '''
  35.  
  36. class Solution:
  37.     def withinLimits(self,i,j,m,n):
  38.         return 0<=i<m and 0<=j<n
  39.  
  40.     def maxEvenSumPaths(self,mat):
  41.         m = len(mat)
  42.         n = len(mat[0])
  43.         dp = [[[0,0] for j in range(n)] for i in range(m)]
  44.         o = 0
  45.         e = 1
  46.         if mat[0][0]%2 == 0:
  47.             dp[0][0][e] = 1
  48.         else:
  49.             dp[0][0][o] = 1
  50.  
  51.        
  52.         for i in range(m):
  53.             for j in range(n):
  54.                 curr = mat[i][j]
  55.                 leftyOdd = 0
  56.                 leftyEven = 0
  57.                 topyOdd = 0
  58.                 topyEven = 0
  59.  
  60.                 if self.withinLimits(i-1,j,m,n):
  61.                     leftyEven = dp[i-1][j][e]
  62.                     leftyOdd = dp[i-1][j][o]
  63.                 if self.withinLimits(i,j-1,m,n):
  64.                     topyOdd = dp[i][j-1][o]
  65.                     topyEven = dp[i][j-1][e]
  66.  
  67.                 if curr%2 != 0:
  68.                     dp[i][j][o] += leftyEven + topyEven
  69.                     dp[i][j][e] += leftyOdd + topyOdd
  70.                 else:
  71.                     dp[i][j][o] += leftyOdd + topyOdd
  72.                     dp[i][j][e] += leftyEven + topyEven
  73.                
  74.         return dp[m-1][n-1][e]
  75.  
  76. if __name__ == "__main__":
  77.     sol = Solution()
  78.     test_cases = [
  79.         # (mat, description)
  80.         # Happy: 2x2, all even, all paths have even sum
  81.         ([[2, 4], [6, 8]], "2x2 all even, all paths even sum"),
  82.         # Happy: 2x2, all odd, only diagonal paths have even sum
  83.         ([[1, 3], [5, 7]], "2x2 all odd, diagonal paths have even sum"),
  84.         # Hard: 3x3, mixed even and odd
  85.         ([[1, 2, 3], [4, 5, 6], [7, 8, 9]], "3x3 mixed even and odd"),
  86.         # Happy: 1x4, horizontal path only
  87.         ([[1, 2, 3, 4]], "1x4 horizontal path only"),
  88.         # Happy: 4x1, vertical path only
  89.         ([[1], [2], [3], [4]], "4x1 vertical path only"),
  90.         # Hard: 3x3, all even
  91.         ([[2, 4, 6], [8, 10, 12], [14, 16, 18]], "3x3 all even"),
  92.         # Hard: 3x3, all odd
  93.         ([[1, 3, 5], [7, 9, 11], [13, 15, 17]], "3x3 all odd"),
  94.         # Edge: 1x1, single cell even
  95.         ([[2]], "1x1 single cell even"),
  96.         # Edge: 1x1, single cell odd
  97.         ([[1]], "1x1 single cell odd"),
  98.         # Hard: 4x4, strategic placement
  99.         ([[1, 2, 1, 2], [2, 1, 2, 1], [1, 2, 1, 2], [2, 1, 2, 1]], "4x4 checkerboard pattern"),
  100.     ]
  101.  
  102.     for idx, (mat, desc) in enumerate(test_cases, start=1):
  103.         try:
  104.             result = sol.maxEvenSumPaths(mat)
  105.         except Exception as e:
  106.             result = f"Error: {e}"
  107.         print(f"Test case {idx}: {desc}")
  108.         for row in mat:
  109.             print(row)
  110.         print(f"-> Even sum paths: {result}\n")
  111.  
  112.  
  113.  
Advertisement
Add Comment
Please, Sign In to add comment