<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>

#include <vector>

using namespace std;

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& grid) {

        int n = grid.size();

        if(n == 1){
            return grid[0][0];
        }
        if(n == 2){
            return min(grid[0][0] + grid[1][1], grid[1][0] + grid[0][1]);
        }

        vector<vector<int>> record(n, vector<int>(n, 0));

        vector<vector<int>> topTwo(2, {-1, 0});

        for(int i = 0; i < n; i++){

            int i1 = 0;
            int v1 = grid[i][i1];
            int i2 = 1;
            int v2 = grid[i][i2];

            if(topTwo[0][0] == i1){
                v1 += topTwo[1][1];
            }
            else{
                v1 += topTwo[0][1];
            }

            if(topTwo[0][0] == i2){
                v2 += topTwo[1][1];
            }
            else{
                v2 += topTwo[0][1];
            }

            if(v2 < v1){
                    swap(v2, v1);
                    swap(i2, i1);
                }



            // cout<<v1<<endl;


            for(int j = 2; j < n; j++){

                int value = grid[i][j];

                // cout<<"i: "<<i<<" j: "<<j<<" value: "<<value<<endl;

                if(topTwo[0][0] == j){
                    value += topTwo[1][1];
                }
                else{
                    value += topTwo[0][1];
                }

                // cout<<value<<endl;

                if(value < v2){
                    v2 = value;
                    i2 = j;
                }

                if(v2 < v1){
                    swap(v2, v1);
                    swap(i2, i1);
                }

            }

            // cout<<v1<<endl;

            topTwo = {{i1, v1}, {i2, v2}};
        }

        return topTwo[0][1];
        
    }
};
18800