试题10 最大子阵(枚举)

21 篇文章 1 订阅
17 篇文章 0 订阅

题目:

给定一个n*m的矩阵A,求A中的一个非空子矩阵,使得这个子矩阵中的元素和最大。其中,A的子矩阵指在A中行和列均连续的一部分。

输入格式
输入的第一行包含两个整数,n,m(1<=n,m<=50),分别表示矩阵A的行数和列数

接下来n行,每行m个整数,表示矩阵Ai,j(-1000<=Ai,j<=1000)

输出格式

输出一行,包含一个整数,表示A中最大的子矩阵的元素和。

样例输入
3   3
2    -4    1
4    -2    2
样例输出
6


  • 分析思路:

选几行和几列,使得元素和最大

暴力枚举上下左右四个边界,求和
要求非空,最小选比-1000还小(矩阵元素为负数的时候)之后更新元素和(和大于-1000的时候)

  • 代码:
#include <iostream>
#include <algorithm>
using namespace std;

int A[60][60]; 
int main(){
	int n,m,ans;
cin>>n>>m;
ans=-1010;  //元素和最小可能比-1000还小 
//读入矩阵 
for(int i=0;i<n;i++){
	for(int j=0;j<m;j++){
		cin>>A[i][j];
	}
} 
//枚举上下左右四个边界 
for(int i=0;i<n;i++){ //枚举上边界 
	for(int j=i;j<n;j++){  //下边界,j=i(下边界最少要等于上边界) 
		for(int k=0;k<m;k++){ //左边界 
			for(int g=k;g<m;g++){ //右边界,至少要大于左边界 g=k 
				int temp=0;  //记录元素和 (i大于j,temp等于0,空矩阵不合法) 
				for(int p=i;p<=j;p++){  //从上边界开始 
					for(int q=k;q<=g;q++){ //左边界开始
						temp+=A[p][q];  //当前子矩阵 
					}
				}
				if(temp>ans){ 
					ans=temp;  //更新 
				}
			}
		}
	}
}
    cout<<ans<<endl;
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值