class Solution {
public:
int longestLine(vector<vector<int>>& M) {
if(M.empty() || M[0].empty()) return 0;
int row = M.size(), col = M[0].size();
vector<vector<vector<int>>> dp(row+1, vector<vector<int>>(col+1, vector<int>(4, 0)));
int max_len = 0;
for(int i=1; i<=row; i++){
for(int j=1; j<=col; j++){
if(M[i-1][j-1] == 0) continue;
dp[i][j][0] = dp[i-1][j][0] + 1;
dp[i][j][1] = dp[i][j-1][1] + 1;
dp[i][j][2] = dp[i-1][j-1][2] + 1;
if(j != col) dp[i][j][3] = dp[i-1][j+1][3] + 1;
for(int k=0; k<4; k++){
max_len = max(max_len, dp[i][j][k]);
}
}
}
return max_len;
}
};
## Blog link: https://code.dennyzhang.com/longest-line-of-consecutive-one-in-matrix
## Basic Ideas:
##
## dp(i, j):
## horizontal: dp(i, j-1)
## vertical: dp(i-1, j)
## diagonal: dp(i-1, j-1)
## anti-diagonal: dp(i-1, j+1)
##
## Complexity: Time O(m*n), Space O(m*n)
class Solution:
def longestLine(self, M):
"""
:type M: List[List[int]]
:rtype: int
"""
row_count = len(M)
if row_count == 0: return 0
col_count = len(M[0])
dp = [[[0, 0, 0, 0] for j in range(col_count)] for i in range(row_count)]
max_count = 0
# dynamic programming
for i in range(row_count):
for j in range(col_count):
if M[i][j] == 0: continue
dp[i][j] = [1, 1, 1, 1]
if j>0: dp[i][j][0] = dp[i][j-1][0] + 1
if i>0: dp[i][j][1] = dp[i-1][j][1] + 1
if i>0 and j>0: dp[i][j][2] = dp[i-1][j-1][2] + 1
if i>0 and j<col_count-1: dp[i][j][3] = dp[i-1][j+1][3] + 1
max_count = max(max_count, max(dp[i][j]))
return max_count
class Solution {
public int longestLine(int[][] M) {
int n = M.length, max = 0;
if (n == 0) return max;
int m = M[0].length;
int[][][] dp = new int[n][m][4];
for (int i=0;i<n;i++)
for (int j=0;j<m;j++) {
if (M[i][j] == 0) continue;
for (int k = 0;k < 4;k++) dp[i][j][k] = 1;
if (j > 0) dp[i][j][0] += dp[i][j-1][0]; // horizontal line
if (j > 0 && i > 0) dp[i][j][1] += dp[i-1][j-1][1]; // anti-diagonal line
if (i > 0) dp[i][j][2] += dp[i-1][j][2]; // vertical line
if (j < m-1 && i > 0) dp[i][j][3] += dp[i-1][j+1][3]; // diagonal line
max = Math.max(max, Math.max(dp[i][j][0], dp[i][j][1]));
max = Math.max(max, Math.max(dp[i][j][2], dp[i][j][3]));
}
return max;
}
}
public int longestLine(int[][] matrix)
{
int m = matrix.Length;
int n = matrix[0].Length;
int ans = 0;
int[][][] F = new int[m][][];
for(int i = 0; i < m; i++)
{
F[i] = new int[n][];
for(int j = 0; j < n; j++)
{
F[i][j] = new int[4];
}
}
for(int i = 0; i < m; i++)
{
for(int j= 0; j < n; j++)
{
if(matrix[i][j] == 0)
{
continue;
}
for (int k = 0; k < 4; k++)
{
F[i][j][k] = 1;
}
if (j > 0)
{
F[i][j][0] = F[i][j - 1][0] + 1;
}
if(i > 0)
{
F[i][j][1] = F[i - 1][j][1] + 1;
}
if (i > 0 && j > 0)
{
F[i][j][2] = F[i - 1][j- 1][2] + 1;
}
if(i > 0 && j < n - 1)
{
F[i][j][3] = F[i - 1][j + 1][3] + 1;
}
for (int k = 0; k < 4; k++)
{
ans = Math.Max(ans, F[i][j][k]);
}
}
}
return ans;
}