历届试题 最大子阵
Posted woxiaosade
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了历届试题 最大子阵相关的知识,希望对你有一定的参考价值。
问题描述
给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大。
其中,A的子矩阵指在A中行和列均连续的一块。
其中,A的子矩阵指在A中行和列均连续的一块。
输入格式
输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数。
接下来n行,每行m个整数,表示矩阵A。
接下来n行,每行m个整数,表示矩阵A。
输出格式
输出一行,包含一个整数,表示A中最大的子矩阵中的元素和。
样例输入
3 3
-1 -4 3
3 4 -1
-5 -2 8
-1 -4 3
3 4 -1
-5 -2 8
样例输出
10
样例说明
取最后一列,和为10。
数据规模和约定
对于50%的数据,1<=n, m<=50;
对于100%的数据,1<=n, m<=500,A中每个元素的绝对值不超过5000。
对于100%的数据,1<=n, m<=500,A中每个元素的绝对值不超过5000。
解题思路:
这是个最大字段和的问题,请参考我的一篇博客。
注意:在求最大值时,一定让其初始值为一个很小的负数
#include <stdio.h> #include <iostream> using namespace std; int MaxSum(); int col[510][510] ; int n,m; int main(){ cin >>n>>m; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ int t; scanf("%d",&t); if(i==0) col[j][0] = t; else col[j][i] = t + col[j][i-1]; } } cout<<MaxSum(); return 0; } int MaxSum(){ int max_t=-9999999999; for(int r0=0;r0<n;r0++){ for(int r1=r0;r1<n;r1++){ int b = 0; for(int i=0; i<m; i++){ if(b>=0){ if(r0==0) b+=col[i][r1]; else b+=col[i][r1] - col[i][r0-1]; } else{ if(r0==0) b=col[i][r1]; else b=col[i][r1] - col[i][r0-1]; } max_t = max_t > b? max_t : b; } } } return max_t; }
以上是关于历届试题 最大子阵的主要内容,如果未能解决你的问题,请参考以下文章