POJ-1050 To the Max(dp)
题目描述
求 \(n\) 行 \(n\) 列矩阵的最大子矩阵(\(1\leq n\leq 100,-127\leq a_{ij}\leq 127\))。
分析
经典题。
预处理每行的前缀和,然后枚举每行的起点 \(i\) 和终点 \(j\),最内层枚举行号 \(k\),更新答案即可,时间复杂度 \(O(n^3)\)。
代码
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF=0x3f3f3f3f;
int a[110][110],sum[110][110];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
sum[i][j]=sum[i][j-1]+a[i][j];
}
}
int ans=-INF;
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
int temp=0;
for(int k=1;k<=n;k++)
{
if(temp<0) temp=0;
temp=temp+sum[k][j]-sum[k][i-1];
ans=max(ans,temp);
}
}
}
cout<<ans<<endl;
return 0;
}
posted on 2020-11-06 19:36 DestinHistoire 阅读(80) 评论(0) 收藏 举报
浙公网安备 33010602011771号