PTA 7-11 最大子矩阵和问题

 题目

最大子矩阵和问题。给定m行n列的整数矩阵A,求矩阵A的一个子矩阵,使其元素之和最大。

输入格式:

第一行输入矩阵行数m和列数n(1≤m≤100,1≤n≤100),再依次输入m×n个整数。

输出格式:

输出第一行为最大子矩阵各元素之和,第二行为子矩阵在整个矩阵中行序号范围与列序号范围。

 

输入样例1:

5 6
60 3 -65 -92 32 -70
-41 14 -38 54 2 29
69 88 54 -77 -46 -49
97 -32 44 29 60 64
49 -48 -96 59 -52 25

输出样例1:

输出第一行321表示子矩阵各元素之和,输出第二行2 4 1 6表示子矩阵的行序号从2到4,列序号从1到6

321
2 4 1 6

 

可运行代码

#include<bits/stdc++.h>
using namespace std;
const int N=1100;
int dp[N][N];

int main(){
	
	
	//第一步:加每一列的前缀和 
	int n,m,result=-0x3f3f3f3f;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			int t;
			cin>>t;
			dp[i][j] = dp[i-1][j]+t;
		}	
	}
	
	
	
	//第二步,根据每一列的前缀和计算子矩阵的最大和 
	
	int x1,y1,x2,y2;
	for(int i=1;i<=n;i++){  //下边界 
		for(int j=1;j<=i;j++){ //上边界 
			int yy=1;  //左边界 
			int temp=0;
			for(int k=1;k<=m;k++){  //右边界 
				temp += dp[i][k]-dp[j-1][k] ;   //加每一列的前缀和 
				if(temp>result){   //大于最大值,赋值 
					result=temp;
					x1=j, x2=i, y1=yy, y2=k;
				}else if(temp<0){ //小于0,左边界移动到k+1,temp重新从k+1加每一列的前缀和 
					temp=0;  //  小于0后重新赋值 
					yy=k+1;
				}
			}			
		}
	}
	
	printf("%d\n%d %d %d %d",result,x1,x2,y1,y2);
	return 0;
} 

第一步:

第二步

yy控制左边界,k控制右边界,j 控制上边界 , i 控制下边界

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值