题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506
题意:求最大能截取的面积
用动态规划求,每块木板向左(向右)方向上,连续大于等于自己长度的最左(右)边的木板,记录编号
遍历所有木板求(right[i] - left[i])*num[i]的最大值,输出;
注意:木板的长度 要用long long或者_int64
num 2 1 4 5 1 3 3
left 1 1 3 4 1 6 6
right 1 7 4 4 7 7 7
#include <stdio.h>
#include <string.h>
long long num[100010];
int r[100010];
int l[100010];
int main()
{
int n;
int i,j;
long long tmp,max;
while(~scanf("%d",&n))
{
if(n == 0)
break;
for(i = 1; i <= n; i++)
{
scanf("%lld",&num[i]);
j = i-1;
while(num[j] >= num[i] && j > 0)
{
if(num[l[j]] >= num[i])
j = l[j] - 1;
}
l[i] = j+1;//输入数据,同时求木板左的数据
}
max = 0;
for(i = n; i > 0; i--)
{
j = i+1;
while(num[j] >= num[i] && j <= n)
{
if(num[r[j]] >= num[i])
j = r[j] + 1;
}
r[i] = j-1;
tmp = (r[i]-l[i]+1)*num[i];//求木板右边的数据,同时求最大值
if(tmp > max)
max = tmp;
}
printf("%lld\n",max);
}
return 0;
}