给你 2 个数组 a,b,a 数组有 n 个数,b 数组有 m 个数, (1<=n,m<=2000,1<=ai,bi<=2000),c 是一个 n*m 的矩阵,c 的第 i 行第 j 列元素为 ai*bj。 现 在 让 你 找 一 个 子 矩 阵 , 该 子 矩 阵 的元素和小于等 于 x(1<=x<=2*10^9),但是要使得该子矩阵面积尽量大。
(注意!元素和与面积不是一个东西)
Input
第一行包含 2 个整数 n,m(1<=n,m<=2000),代表 a 数组和 b 数组的大小。
第二行 n 个数,代表数组 a 的元素(1<=ai<=2000)。
第三行 m 个数,代表数组 b 的元素(1<=bi<=2000)。
第四行 x(1<=x<=2*10^9)
Output
输出最大的符合条件的矩阵的面积。
Examples
Input
3 3
1 2 3
1 2 3
9
Output
4
Input
5 1
5 4 2 4 5
2
5
Output
1
#include<iostream>
using namespace std;
typedef long long ll;//定义long long为ll
const ll inf=0x3f3f3f3f; //最大值
const int N=2e3+10;
ll a[N],b[N],sa[N],sb[N],ma[N],mb[N];
int main(){
int n,m;cin>>n>>m;
for(int i=0;i<=n;i++)ma[i]=inf;
for(int i=0;i<=m;i++)mb[i]=inf;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>b[i];
ll x;cin>>x;
for(int i=1;i<=n;i++)sa[i]=sa[i-1]+a[i];
for(int i=1;i<=m;i++)sb[i]=sb[i-1]+b[i];
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++)//行元素和
ma[j-i+1]=min(ma[j-i+1],sa[j]-sa[i-1]);
}
for(int i=1;i<=m;i++){//列元素和
for(int j=i;j<=m;j++)
mb[j-i+1]=min(mb[j-i+1],sb[j]-sb[i-1]);
}
//列元素和*行元素和==该矩阵元素和
int ans=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(ma[i]*mb[j]<=x) // 不超过x
ans=max(ans,i*j);//取最大
}
}
cout<<ans<<endl;
return 0;
}