String 求矩阵中最长序列的长度

String 求矩阵中最长序列的长度,string,algorithm,matrix,dynamic-programming,String,Algorithm,Matrix,Dynamic Programming,问题: 给定一个只有1和0的布尔矩阵。求连续1的最长序列的长度。只允许南部、东南部和东部移动 样本矩阵:输出5 10000 01111 00100 00010 我正试图解决这个问题,但在理解这个问题的过程中还没有找到一个可能的解决方案。在剖析和理解问题时需要帮助 更新: 请分享正确性 for i=1 to n+1 N[i][m+1] = 0; for j=1 to m+1 N[n+1][j] = 0; for i=n to 1 for j=m to 1

问题:

给定一个只有1和0的布尔矩阵。求连续1的最长序列的长度。只允许南部、东南部和东部移动

样本矩阵:输出5

10000
01111
00100
00010
我正试图解决这个问题,但在理解这个问题的过程中还没有找到一个可能的解决方案。在剖析和理解问题时需要帮助

更新:

请分享正确性

for i=1 to n+1
     N[i][m+1] = 0;
for j=1 to m+1
     N[n+1][j] = 0;
for i=n to 1
     for j=m to 1
          if M[i][j] == 1
                N[i][j] = 1 + max(N[i+1][j] , N[i][j+1]);
          else
                N[i][j] = 0
search max element in matrix, output it.
}
迄今为止已尝试过

int main()
{
    int A[5][5] = {{0,0,0,1,1},{1,1,1,0,1},{0,1,1,1,0},{0,0,1,0,0},{1,1,1,1,1}};
    int temp[5][5];
    int end_r(0), end_c(0);
    for(int i=0; i<;5; i++){
        for(int j=0; j<;5; j++){
            temp[i][j] = A[i][j];
            int top(0), left(0), max(0); 
            if(i>;0) top = temp[i-1][j];
            if(j>;0) left = temp[i][j-1];
            if(top>left) max = top; else max=left;
            if(temp[i][j] && max) {temp[i][j] = ++max, end_r=i; end_c=j;}
            cout<<temp[i][j]<<" ";

        }
        cout<<endl;
    }
    int i = end_r, j = end_c, count=temp[i][j];
    --count;
    while(count){    
    if((temp[i-1][j]) == count) --i; else --j;
    --count;
}

    cout<<"Starting Point"<<" "<<i<<" "<<j<<endl;
    cout<<"Ending Point"<<" "<<end_r<<" "<<end_c<<endl;
    cout<<"Max Length"<<" "<<temp[end_r][end_c];
    return 0;
}
参考
这是一个动态规划问题。假设您已经解决了第i行和第j列之前的问题。对于小于i的每一行,以及小于j的每一列,答案都存储在DP[]中

现在,你应该把它看作归纳法。DP[i][j]的最佳答案可能来自这三个地方(如果它们存在——这意味着它们是有效的指数,M[i][j]==1):

您放置的代码(第一个代码)试图模拟此情况,但实际上没有为此测试用例提供适当的解决方案(因为它无法捕获东南移动):

事实上,您的第一个代码需要如下所示:

N[i][j] = 1 + max(N[i+1][j] , N[i][j+1], N[i + 1][j + 1]);

注意,N[i][j]类似于我描述的DP[i][j]。然而,我描述了问题的方式,即向南、东南、向东移动。但N[][]正以另一种方式解决问题,即它从右下角开始向西、向西、向北移动。但其实不要紧,;它们都将提供相同的解决方案。(了解原因是一个很好的练习)

这是一个动态规划问题。假设您已经解决了第i行和第j列之前的问题。对于小于i的每一行,以及小于j的每一列,答案都存储在DP[]中

现在,你应该把它看作归纳法。DP[i][j]的最佳答案可能来自这三个地方(如果它们存在——这意味着它们是有效的指数,M[i][j]==1):

您放置的代码(第一个代码)试图模拟此情况,但实际上没有为此测试用例提供适当的解决方案(因为它无法捕获东南移动):

事实上,您的第一个代码需要如下所示:

N[i][j] = 1 + max(N[i+1][j] , N[i][j+1], N[i + 1][j + 1]);

注意,N[i][j]类似于我描述的DP[i][j]。然而,我描述了问题的方式,即向南、东南、向东移动。但N[][]正以另一种方式解决问题,即它从右下角开始向西、向西、向北移动。但其实不要紧,;它们都将提供相同的解决方案。(了解原因是一个很好的练习)

您只是在这里放弃了一个要求;但我们希望你向我们展示你自己解决问题的努力。将你的代码粘贴到这里,我们将看到其中的错误并指导你正确的方向。我已经更新了我的假设。我正在寻找一个关于如何解决这个问题的可理解的思维过程。请展示您迄今为止编写的代码。lol。当我问一个问题时,人们说你应该表现出你的努力。当我在谷歌上搜索一些代码时,这些代码几乎可以解决这个问题。人们说我是为了挑战而丢弃一些代码。如何参与挑战我正在努力理解一个问题,并试图写出一个最优的解决方案。寻找具有最佳时间和空间复杂性的最优解决方案你只是在这里放弃了一个要求;但我们希望你向我们展示你自己解决问题的努力。将你的代码粘贴到这里,我们将看到其中的错误并指导你正确的方向。我已经更新了我的假设。我正在寻找一个关于如何解决这个问题的可理解的思维过程。请展示您迄今为止编写的代码。lol。当我问一个问题时,人们说你应该表现出你的努力。当我在谷歌上搜索一些代码时,这些代码几乎可以解决这个问题。人们说我是为了挑战而丢弃一些代码。我正在努力理解一个问题并试图写出一个最优的解决方案。寻找具有最佳时间和空间复杂性的最优解决方案
DP[i - 1][j] (a south move from there to i, j)
DP[i - 1][j - 1] (a south east move from there)
DP[i][j - 1] (an east move from there)
100
010
001
N[i][j] = 1 + max(N[i+1][j] , N[i][j+1], N[i + 1][j + 1]);