最大子矩阵
Descriprition
输入是一个N×N的矩阵。
输入的第一行给出N(0<N≤100)。
再后面的若干行中,依次(首先从左到右给出第一行的N个整数,再从左到右给出第二行的N个整数……)给出矩阵中的N*N个整数
输出最大子矩阵 和的值
方法一
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
const int N=105;
int a[N][N],f[N][N];
// f[i][j] 记录第i行 1到j 个的元素的 和
// 题目转化为 暴力 第i列 到第j列 的垂直方向的最大子段和
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
f[i][j]=f[i][j-1]+a[i][j];
}
int ans=-inf,mx=0;
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++) // 确定 第i列 到第j列 的列数
{
mx=0;
for(int k=1;k<=n;k++)
{
if(mx>0)
{
mx+=f[k][j]-f[k][i-1];
}
else
mx=f[k][j]-f[k][i-1];
ans=max(ans,mx);
}
}
printf("%d\n",ans);
return 0;