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; }