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

Codeforces Round #513 C. Maximum Subrectangle(思維)

       題意是輸入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;
}