hdu 1506

题目链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值