
思路
定义a[i][j]为从(0,0)到(i,j)矩形中所有元素的和。则题目就是求出最大的a[i][j]-a[i-m][j]-a[i][j-m]+a[i-m][j-m],
注意:125M最多可开int[5000][5000]
代码
int n,m,len = 5001;
int[][] a = new int[len][len];
int[] b = new int[len];
void test() throws IOException {
Reader cin = new Reader();
n = cin.nextInt();
m = cin.nextInt();
for(int i = 0; i < n; i++) {
int x = cin.nextInt();
int y = cin.nextInt();
a[x][y] = cin.nextInt();
}
for(int i = 0; i < len; i++) {
int s = 0;
for(int j = 0; j < len; j++) {
s+=a[i][j];
a[i][j] = s+b[j];
b[j] = a[i][j];
}
}
int ma = 0;
for(int i = m; i < len; i++) {
for(int j = m; j < len; j++) {
ma = Math.max(ma, a[i][j]-a[i-m][j]-a[i][j-m]+a[i-m][j-m]);
}
}
System.out.println(ma);
}
本文介绍了一种解决最大矩形子矩阵和问题的方法,通过定义状态并运用动态规划求解,同时强调了代码实现中如何控制内存使用以处理大规模数据。核心在于求解a[i][j]与周围差值的最大值,适用于125M规模的数据处理。

被折叠的 条评论
为什么被折叠?



