Codeforces Round #513 C. Maximum Subrectangle(思維)
阿新 • • 發佈:2018-12-13
題意是輸入n和m兩組數,再輸入一個值x,由這兩組陣列成一個n*m的矩陣a[i][j]表示a[i]*b[j]的值,在這個矩陣中找子矩陣,使得該子矩陣中所有的元素之和小於等於x,問所有符合條件的子矩陣中,面積最大的是多少。
思路就是維護一個字首和,然後去更新長度為1,2,3...n的子陣列的和的最小值,然後聯絡兩個陣列遍歷矩陣求解,直接看呆碼吧...
AC程式碼:
#include <bits/stdc++.h> #define ll long long #define inf 0x3f3f3f3f #define maxn 20005 using namespace std; ll a[maxn],b[maxn],_a[maxn],_b[maxn]; int n,m,x; int main() { scanf("%d%d",&n,&m); a[0] = 0; b[0] = 0; for(int i=1;i<=n;i++)scanf("%lld",&a[i]),a[i] += a[i-1]; for(int i=1;i<=m;i++)scanf("%lld",&b[i]),b[i] += b[i-1]; scanf("%d",&x); for(int i=1;i<=n;i++){ _a[i] = inf; for(int j=i;j<=n;j++){ _a[i] = min(_a[i], a[j] - a[j - i]); } } for(int i=1;i<=m;i++){ _b[i] = inf; for(int j=i;j<=m;j++){ _b[i] = min(_b[i], b[j] - b[j - i]); } } int ans = 0; for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ if(_a[i] * _b[j] <= x){ ans = max(ans, i * j); } } } printf("%d\n",ans); return 0; }