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.