HDU 1506 Largest Rectangle in a Histogram(dp)
1299 ワード
タイトルリンク:HDU 1506 Largest Rectangle in a Histogram
各板について、Area=height[i]*(j-k+1)は、いずれかのx、j<=x<=k、height[x]>=height[i];jを探して、kは肝心になります.
ダイナミックプランニングを使用して、左の高さがそれ自体に等しい場合、左の左境界は必ずこの性質を満たし、この境界の左から反復します.左境界を反復して右境界を反復します.
杭電で何度もTLEを提出して、c++の入出力はcの入出力に変えて、long long、_int 64は提出を変えて、どうしてもだめで、最後に提出方式をg++からc++に変更しました.過ぎました...
各板について、Area=height[i]*(j-k+1)は、いずれかのx、j<=x<=k、height[x]>=height[i];jを探して、kは肝心になります.
ダイナミックプランニングを使用して、左の高さがそれ自体に等しい場合、左の左境界は必ずこの性質を満たし、この境界の左から反復します.左境界を反復して右境界を反復します.
杭電で何度もTLEを提出して、c++の入出力はcの入出力に変えて、long long、_int 64は提出を変えて、どうしてもだめで、最後に提出方式をg++からc++に変更しました.過ぎました...
#include <iostream>
using namespace std;
const int MAX_N = 100000 + 100;
long long arr[MAX_N];
//__int64 arr[MAX_N];
int l[MAX_N],r[MAX_N];
int n;
int main()
{
while(cin >> n,n)
{
for(int i = 1;i <= n;i++)
{
cin >> arr[i];
l[i] = r[i] = i;
}
for(int i = 1;i <= n;i++)
{
while(l[i] - 1 > 0 && arr[l[i] - 1] >= arr[i])
{
l[i] = l[l[i] - 1];
}
}
for(int i = n;i > 0;i--)
{
while(r[i] + 1 <= n && arr[r[i] + 1] >= arr[i])
{
r[i] = r[r[i] + 1];
}
}
long long _max = 0;
//__int64 _max = 0;
for(int i = 1;i <= n;i++)
_max = max(_max,(r[i] - l[i] + 1) * arr[i]);
cout << _max << endl;
}
return 0;
}