<p>Given an <code>n x n</code> integer matrix <code>grid</code>, return <em>the minimum sum of a <strong>falling path with non-zero shifts</strong></em>.</p>

<p>A <strong>falling path with non-zero shifts</strong> is a choice of exactly one element from each row of <code>grid</code> such that no two elements chosen in adjacent rows are in the same column.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2021/08/10/falling-grid.jpg" style="width: 244px; height: 245px;" />
<pre>
<strong>Input:</strong> grid = [[1,2,3],[4,5,6],[7,8,9]]
<strong>Output:</strong> 13
<strong>Explanation:</strong> 
The possible falling paths are:
[1,5,9], [1,5,7], [1,6,7], [1,6,8],
[2,4,8], [2,4,9], [2,6,7], [2,6,8],
[3,4,8], [3,4,9], [3,5,7], [3,5,9]
The falling path with the smallest sum is&nbsp;[1,5,7], so the answer is&nbsp;13.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> grid = [[7]]
<strong>Output:</strong> 7
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>n == grid.length == grid[i].length</code></li>
	<li><code>1 &lt;= n &lt;= 200</code></li>
	<li><code>-99 &lt;= grid[i][j] &lt;= 99</code></li>
</ul>

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& grid) {
        int n = grid.size();
        int m = grid[0].size();
        vector<vector<int>> dp(n,vector<int> (m,0));

        
        int p = 1e9;
        int q = 1e9;
        int pi = 0;
        int qi = 0;
        for(int i = 0;i<n;i++)
        {

            if(i == 0)
            {
                int ind = -1;
                for(int j = 0;j<m;j++)
                {
                    dp[i][j] = grid[i][j];
                    if(grid[i][j] < p)
                    {   
                        p = grid[i][j];
                        ind = j;
                    }
                }
                pi = ind;
                
                int i1 = -1;
                p = 1e9;
                for(int j = 0;j<m;j++)
                {
                    if(j == ind)
                    {
                        continue;
                    }
                    if(grid[i][j]<q)
                    {
                        q = grid[i][j];
                        i1 = j;
                    }
                }
                qi = i1;
                // cout<<"1"<<endl;
            }    
            else
            {
                // cout<<pi<<" "<<qi<<endl;
                for(int j = 0;j<m;j++)
                {
                    if(j!=pi)
                    {
                        dp[i][j] = dp[i-1][pi] + grid[i][j];
                    }
                    else
                    {
                        dp[i][j] = dp[i-1][qi] + grid[i][j];
                    }
                }
                // cout<<2<<endl;
                p = 1e9;
                q = 1e9;
                int ind = -1;
                for(int j = 0;j<m;j++)
                {
                    
                    if(dp[i][j] < p)
                    {   
                        p = dp[i][j];
                        ind = j;
                    }
                    pi = ind;
                }
                    
                int i1 = -1;
                p = 1e9;
                for(int j = 0;j<m;j++)
                {
                    if(j == ind)
                    {
                        continue;
                    }
                    if(dp[i][j]<p)
                    {
                        p = dp[i][j];
                        i1 = j;
                    }
                }
                qi = i1;
                

            }  
        }
        int mini = 1e9;
        // for(int i = 0;i<n;i++)
        // {
        //     for(int j = 0;j<m;j++)
        //     {
        //         cout<<dp[i][j]<<" ";
        //     }
        //     cout<<endl;
        // }
        for(int j = 0;j<m;j++)
        {
            mini = min(mini,dp[n-1][j]);
        }
        return mini;
    }
};
18700