日常练习题

【问题描述】

给定一个 N × M 的矩阵 A,请你统计有多少个子矩阵 (最小 1 × 1,最大 N × M) 满足子矩阵中所有数的和不超过给定的整数 K?

【输入格式】

第一行包含三个整数 N, M 和 K. 之后 N 行每行包含 M 个整数,代表矩阵 A.

【输出格式】

一个整数代表答案。

【样例输入】

3 4 10

1 2 3 4

5 6 7 8

9 10 11 12

【分析】

看见题,有点头大,唯一想道的只有通过枚举来一遍遍找,这样的话,要用到6个循环,可行但是不太好。首先要循环完成 1*1、1*2、…N*M所有子矩阵,完了找每个可以作为子矩阵的第一个坐标点,再将子矩阵里的每一个点相加判断。

【代码】

int Data(int N,int M){
	int x=0,y=0;
	int all=0,al=0;
	for (int i=0;i<N;i++)
	{
		for (int j=0;j<M;j++)
		{
			for (int x=0;x+i<N;x++)
			{
				for(int y=0;y+j<M;y++)
				{
					for(int z=0;z<=i;z++)
					{
						for (int h=0;h<=j;h++){
							al += n[x+z][y+h];
						}
					}
					if (al<=K){
						all++;
					}
					al = 0;
				}
			}
		}		
	}
	return all;
}

【思考】

代码可以遍历所有正确的子矩阵,但是使用了6个for循环,如果矩阵增大,运行时间大大增加。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值