洛谷:最大加权矩形 C语言 (小细节粗心)

洛谷:最大加权矩形
今天写这道题目,出现了诸多问题,其中一些问题是无关逻辑的,纠错时间过长。
一直爆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,但还有写细节问题需要注意!!!
总觉得这道题有其他便捷的解法…

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值