贴个我的cpp代码, O(2n)时间空间;- int max_len(vector<vector<int>> &m) {
- int rows = m.size();
- int cols = m.front().size();
- vector<vector<int>> left(rows, vector<int>(cols, INT_MIN));
- auto right = left;
- if (m[0][0] == 0) left[0][0] = 1;
- if (m[0][cols - 1] == 0) right[0][cols - 1] = 1;
- for (int i = 1; i < cols; i++) {
- if (m[0][i]) continue;
- left[0][i] = m[0][i - 1] ? 1 : left[0][i - 1] + 1;
- }
- for (int i = cols - 2; i >= 0; i--) {
- if (m[0][i]) continue;
- right[0][i] = m[0][i + 1] ? 1 : right[0][i + 1] + 1;
- }
- for (int r = 1; r < rows; r++) {
- if (m[r - 1][0] == 0 && m[r][0] == 0) left[r][0] = max(left[r - 1][0], right[r - 1][0]) + 1;
- for (int c = 1; c < cols; c++) {
- if (m[r][c]) continue;
- if (m[r][c - 1] == 0) left[r][c] = max(left[r][c], left[r][c - 1] + 1);
- if (m[r - 1][c] == 0) left[r][c] = max(left[r][c], max(left[r - 1][c], right[r - 1][c]) + 1);
- }
- if (m[r - 1][cols - 1] == 0 && m[r][cols - 1] == 0) right[r][cols - 1] = max(left[r - 1][cols - 1], right[r - 1][cols - 1]) + 1;
- for (int c = cols - 2; c >= 0; c--) {
- if (m[r][c]) continue;
- if (m[r][c + 1] == 0) right[r][c] = max(right[r][c], right[r][c + 1] + 1);
- if (m[r - 1][c] == 0) right[r][c] = max(right[r][c], max(right[r - 1][c], left[r - 1][c]) + 1);
- }
- }
- return max(*max_element(left[rows - 1].begin(), left[rows - 1].end()),
- *max_element(right[rows - 1].begin(), right[rows - 1].end()));
- }
复制代码 |