原题链接点这里
解题思路
主要是暴力方法,先循环求出以从第1到第n-1个挡板为左挡板的水槽容积的最大值,再暴力循环遍历第i和j个挡板为水槽的容积加上以j为左挡板的水槽的最大值。求出所有的最大值输出。
#include<iostream>
using namespace std;
using ll = long long;
const int N = 5000+10;
int n;
ll d[N];
ll v[N][N]; // d[i][j] 表示第i j挡板组成的水槽的容积
ll maxv[N]; // maxd[i] 表示以i为左挡板的水槽容积的最大值(为了共用挡板)
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%lld", &d[i]);
// 暴力计算每对水槽的容积,并求出每个以i为左挡板的水槽容积的最大值
for (int i = 1; i <= n - 1; i++)
{
for (int j = i + 1; j <= n; j++)
{
v[i][j] = min(d[i], d[j]) * (j - i);
maxv[i] = max(maxv[i], v[i][j]);
}
}
ll ans = 0;
// 暴力求出共用挡板的最大值
for (int i = 1; i <= n; i++)
{
for (int j = i + 1; j <= n; j++)
{
ans = max(ans, v[i][j] + maxv[j]);
}
}
printf("%lld", ans);
return 0;
}