#CS50102. 完善程序1-数组-2最大子矩阵和

完善程序1-数组-2最大子矩阵和

(最大子矩阵和)给出 m 行 n 列的整数矩阵,求最大的子矩阵和(子矩阵不能为空)。

输入第一行包含两个整数 m 和 n,即矩阵的行数和列数。之后 m 行,每行 n 个整数,描述整个矩阵。程序最终输出最大的子矩阵和。

(最后一空 4 分,其余 3 分,共 16 分)

比如在如下这个矩阵中:

4  4 
0 -2 -7 0  
9 2 -6 2
-4 1 -4 1
-1 8 0 -2

拥有最大和的子矩阵为:

9 2
-4 1
-1 8

其和为 15

3  3
-2 10 20
-1 100 -2
0 -2 -3

最大子矩阵和为 128

4  4
0 -2 -9 -9
-9 11 5 7
-4 -3 -7 -6
-1  7  7  5

最大子矩阵和为 26

#include <iostream>
using namespace std;
const int SIZE = 100;
int matrix[SIZE + 1][SIZE + 1];
int rowsum[SIZE + 1][SIZE + 1]; /* rowsum[i][j]记录第i行前j个数的和 */
int m, n, i, j, first, last, area, ans;
int main()
{
    cin >> m >> n;
    for ( i = 1; i <= m; i++ )
        for ( j = 1; j <= n; j++ )
            cin >> matrix[i][j];
    ans = matrix   ①;
    for ( i = 1; i <= m; i++ )
        ②;
        for ( i = 1; i <= m; i++ )
            for ( j = 1; j <= n; j++ )
                rowsum[i][j] = ③;
    for ( first = 1; first <= n; first++ )
        for ( last = first; last <= n; last++ )
        {
            ④;
            for ( i = 1; i <= m; i++ )
            {
                area += ⑤;
                if ( area > ans )
                    ans = area;
                if ( area < 0 )
                    area = 0;
            }
        }
    cout << ans << endl;
    return(0);
}
  1. ①处应填( ){{ select(1) }}
  • [0][0]
  • [0][n]
  • [m][0]
  • [1][1]
  1. ②处应填( ){{ select(2) }}
  • rowsum[i][0]=matrix[i][1]
  • rowsum[i][0]=1
  • rowsum[i][0]=0
  • rowsum[i][0]=ans
  1. ③处应填( ){{ select(3) }}
  • rowsum[i][j-1]
  • rowsum[i-1][j]+matrix[i][j]
  • matrix[i][j]
  • rowsum[i][j-1]+matrix[i][j]
  1. ④处应填( ){{ select(4) }}
  • area=0
  • ans=area
  • area=ans
  • ans=0
  1. ⑤处应填( ){{ select(5) }}
  • matrix[i][last]
  • rowsum[i][last]-rowsum[i][first-1]
  • matrix[i][first]
  • rowsum[i][last]-rowsum[i][first]