常识,选B
常识,选A
常识,选B
八位二进制转十进制在0到255之间,所以选D
同上题,c中有256,所以选C
#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;
}
题目解析
本题解决最大子矩阵和所用的算法:计算数组rowsum
;枚举子矩阵的左边界first
和右边界last
,将原问题转化为求解一维的最大子段和问题,用贪心法即可解决。
①因为所求最大子矩阵和所涉及的子矩阵不能为空,必须有一个初值,所以我们需要将ans
设置为矩阵的左上角元素,也就是 [1][1],取其他单元格的值也可以;
②因为后面要求每行前缀和,所以需要将 0 列清零,用于之后的统计;
③求当前行到当前列的前缀和,使用前缀和的方法统计每行的sum
值;
④从first
列到last
列之间求最大子段和,需要将当前的值初始化为 0;
⑤这里求第i
行的first
列到last
列之间的数值和,这里采用前缀和方法来加速计算过程。