洛谷:最大加权矩形
今天写这道题目,出现了诸多问题,其中一些问题是无关逻辑的,纠错时间过长。
一直爆RE,原因是什么呢?请看以下代码,找出几点错误。
复习RE原因
1、数组空间太小,不符合题意,最好留出5-10个空余;
开在全局变量/用动态数组 : (类型说明符*) malloc(unsigned int size);
2、数组空间太大,超出题目要求,有内存要求的最好设计紧凑点/动态数组
3、除数为零,比如一个for循环i从0到10,每次用n除i就会出现一个n/0。在Dev中编译会出现[Warning]division by zero
的警告,运行时程序会卡住,在OJ中,程序卡住没有返回值,程序一直等着,也就超时了——即RE
原因总结:数组越界访问、指针乱指、浮点错误(除数为零、模数为零),堆栈溢出(递归层次太深)、。
找错
二维前缀和,用坐标/下标法
#include <stdio.h>
//#define N -1e9
const int N=-1e9;
#define max(a, b) (((a) > (b)) ? (a) : (b))
int main() {
int xa,ya,xb,yb,i,j,n;
int arr[N][N],s[N][N];
//数据录入
scanf("%d",&n);
for (i = 1; i <= n; i++) {
for( j = 1; j <= n; j++) {
scanf("%d",arr[i][j]);
//维护
s[i][j] = s[i][j-1] + s[i-1][j] - s[i-1][j-1] + arr[i][j];
// 找s[i][j]所包围的矩阵,即从(1,1)开始到(i,j)的矩形面积;去重(容斥原理)
}
}
int sub,ans = -1e9;//sub: s[xb-xa][yb-ya]
//数据处理
for( xa = 1; xa <= n; xa++) {
for( ya = 1; ya <= n; ya++) {
for( xb = xa; xb <= n; xb++ ) {
for( yb = ya; yb <= n; yb++) {
sub = s[xb][yb] - s[xb][ya] - s[xa][yb] + s[xa][ya];
ans = max(ans,sub);
}
}
}
}
printf("%d",ans);
return 0;
}
常规错误
错误1:数组大小定义为负数 “const int N=-1e9;”
错误2:输入函数的格式写错,忘记加&
!
逻辑错误!!!
求矩形中的小矩形面积,大矩形-靠近墙壁的两个矩形+两靠近墙壁的两矩形重叠的面积注意边界(位置边界,要-1)
由于这代码是参考网上资源,有一点不清楚,如下👇
正确代码
二维前缀和,用坐标/下标法
#include <stdio.h>
//#define N 125
const int N=125;
#define max(a, b) (((a) > (b)) ? (a) : (b))
int main() {
int xa,ya,xb,yb,i,j,n;
int arr[N][N],s[N][N];
//数据录入
scanf("%d",&n);
for (i = 1; i <= n; i++) {
for( j = 1; j <= n; j++) {
scanf("%d",&arr[i][j]); //忘记写&符号
//维护
s[i][j] = s[i][j-1] + s[i-1][j] - s[i-1][j-1] + arr[i][j];
// 找s[i][j]所包围的矩阵,即从(1,1)开始到(i,j)的矩形面积;去重(容斥原理)
}
}
int sub,ans = -1e9;//sub: s[xb-xa][yb-ya]
//数据处理
for( xa = 1; xa <= n; xa++) {
for( ya = 1; ya <= n; ya++) {
for( xb = xa; xb <= n; xb++ ) {
for( yb = ya; yb <= n; yb++) {
sub = s[xb][yb] - s[xb][ya-1] - s[xa-1][yb] + s[xa-1][ya-1]; //忘记-1啦
ans = max(ans,sub);
}
}
}
}
printf("%d",ans);
return 0;
}
总结
重点学习他人的思路,代码不必照抄,虽然是C++转C,但还有写细节问题需要注意!!!
总觉得这道题有其他便捷的解法…