hdu 1506 dp思想的應用

我們要求最大矩形面積,那麼我們應該求每個矩形向兩邊延伸的最大長度,最壞情況爲0(n),必然TLE,那麼我們可以應該DP的思想,用一個數組來保存一些結果。

例如,dpl【i】表示從左邊過來的最長,那麼我們計算dpl【i】的時候,如果左邊的比自己高,那麼dpl【i】=dpl【i-1】,但是可能在前面還有更多符合情況的(比i-1低但是比i高),所以我們要用i-1-dp【i-1】,繼續尋找,詳情看代碼

#include<iostream>
#include<string.h>
#define LL long long 
using namespace std;
const int maxn=100010;
int dpl[maxn],dpr[maxn];
LL height[maxn];
int main()
{
	LL ans;
	int i,j,n;
	while(scanf("%d",&n)&&n)
	{
		for(i=1;i<=n;i++)
		{
			scanf("%d",&height[i]);
			dpl[i]=dpr[i]=1;
		}
		for(i=2;i<=n;i++)
		{
			int s=i-1;
			while(height[i]<=height[s]&&s>=1)
			{
				dpl[i]+=dpl[s];
				s=s-dpl[s];//繼續尋找
			}
		}
		for(i=n-1;i>=1;i--)
		{
			int s=i+1;
			while(height[i]<=height[s]&&s<=n)
			{
				dpr[i]+=dpr[s];
				s=s+dpr[s];
			}
		}
		ans=0;
		for(i=1;i<=n;i++)
		{
			LL temp=(height[i]*(dpl[i]+dpr[i]-1));
			if(ans<temp) ans=temp;
		}
		cout<<ans<<endl;
	}
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章