public boolean hasValidPath(char[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        if ((m + n) % 2 == 0) {
            return false;
        }
        if (grid[0][0] == ')') {
            return false;
        }
        if (grid[m - 1][n - 1] == '(') {
            return false;
        }
        int v = (m + n + 1)/2;
        boolean[][][] dp = new boolean[m + 1][n + 1][v];
        dp[0][1][0] = true;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                for (int k = 0; k < v; k++) {
                    if (dp[i+1][j][k] || dp[i][j + 1][k]) {
                        int step = grid[i][j] == '(' ? 1 : -1;
                        if (k + step >= 0 && k + step < v) {
                            dp[i + 1][j + 1][k + step] = true;
                        }
                    }
                }
            }
        }
        return dp[m][n][0];
    }
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.