您的位置:首页 > 其它

hdu 1506

2015-10-10 16:37 190 查看
题目链接: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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: