1. 程式人生 > >Codeforces Round #513 C - Maximum Subrectangle (數學+思維)

Codeforces Round #513 C - Maximum Subrectangle (數學+思維)

int each bit bar box nbsp 可以轉化 ces arrays

已知一個長度為n的數組a和一個長度為m的數組b,問當兩者相乘組成矩陣時求滿足子矩陣中所有數相加小於x的最大面積

數學題,這個問題可以轉化為從A和B中找到一個子陣列,使得這些子陣列的元素總和的乘積小於或等於x,並且它們的大小的乘積是最大的

#include <bits/stdc++.h>
#define ll long long

using namespace std;

const int maxn=2000+10;

ll a[maxn],b[maxn],minsa[maxn],minsb[maxn];
ll n,m,x;

int main()
{
    ios::sync_with_stdio(
false);cin.tie(0); cin>>n>>m; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<m;i++){ cin>>b[i]; } cin>>x; for(int i=0;i<maxn;i++) minsa[i]=minsb[i]=x+1; for(int i=0;i<n;i++) { ll sum=0;
for(int j=i;j<n;j++) { sum+=a[j]; minsa[j-i+1]=min(minsa[j-i+1],sum); } } for(int i=0;i<m;i++) { ll sum=0; for(int j=i;j<m;j++) { sum+=b[j]; minsb[j-i+1]=min(minsb[j-i+1],sum); } }
int ans=0; for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++){ if(minsa[i]*minsb[j]<=x) ans=max(ans,i*j); } } cout<<ans<<endl; return 0; }

Codeforces Round #513 C - Maximum Subrectangle (數學+思維)