I 时空的交织
题目描述
小红拿到了一个n行m列的矩阵,矩阵中每个元素的权值由a数组和b数组决定。第i行第j列的元素为ai∗bj。小红希望选择一个子矩形,使得该子矩形所有元素的和尽可能大。你能帮帮她吗?
考察基本知识点:dp查找数组中一段子数组的和的最大最小值
需要思维转换一下的地方(本题关键):(i1,j1)与(i2,j2)两点围成的矩形中元素的和实际上就是(a[i1]+...+a[i2])*(b[j1]+...b[j2])
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
long long find_max(int c[],int num)//dp找区间和的最大值
{
long long cur=0,res=-2e9;
for(int i=1;i<=num;i++)
{
if(cur>0)cur+=c[i];
else cur=c[i];
res=max(res,cur);
}
return res;
}
long long find_min(int c[],int num)//dp找区间和的最小值
{
long long cur=0,res=2e9;
for(int i=1;i<=num;i++)
{
if(cur<0)cur+=c[i];
else cur=c[i];
res=min(res,cur);
}
return res;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>b[i];
long long max_a=find_max(a,n);
long long min_a=find_min(a,n);
long long max_b=find_max(b,m);
long long min_b=find_min(b,m);
long long result=max({max_a*max_b,min_a*min_b,max_a*min_b,min_a*max_b});
cout<<result;
return 0;
}