题目:http://acm.hdu.edu.cn/showproblem.php?pid=1506

刚开始没考虑时间复杂度,直接敲了,直接tle了,之后没有思路,然后看题解,看见大神写的优化非常棒。

大神的解释:(其实对于w[i]来说,如果去求后面连续的值,完全没必要一个个去比对,直接看w[i-1]的值就行了。

比如说2、3、4、5这个序列,如果我们要看3往后能延伸多长,并不需要去逐个和4和5比较,在计算4的时候,我们已经计算过5是比4大的,因为3比4小,4所能往后延伸的长度,3也一定能达到(4能延伸的长度内的数据都大于等于4,当然也都比3大),我们可以直接比较在4达到的最终长度的末端之后的值。(dp进行记录)

这道题计算的时候进制转换也需要特别注意,如果temp没有强制转换成__int64位,提交会wa。注意强制转换啊,否则wa.)

这道题优化的思路非常巧妙,很值得学习。

DP 找出 a[i] 的左边(l[i])和右边(r[i])与自己连着的比自己大的数的长度 , 然后用这个长度乘以 a[i], 乘积最大的那个就是答案 .

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define inf 0x3f3f3f3f
typedef __int64 ll;
using namespace std;
int n,w[],l[],r[];
int main()
{
ll maxx,zan;
while(scanf("%d",&n)!=EOF&&n!=)
{
for(int i=;i<=n;i++)
{
scanf("%d",&w[i]);
l[i]=r[i]=i;
}
for(int i=;i<=n;i++)
{
while(l[i]>&&w[l[i]-]>=w[i])
{
l[i]=l[l[i]-];
}
}
for(int i=n-;i>=;i--)
{
r[i]=i;
while(r[i]<n&&w[r[i]+]>=w[i])
{
r[i]=r[r[i]+];
}
}
maxx=-inf;
for(int i=;i<=n;i++)
{
zan=(ll)(r[i]-l[i]+)*w[i];//以前一直对变量的存储有个错误的了解,如果(r[i]-l[i]+1)*w[i]
maxx=max(maxx,zan);//如果不强制转换的话,则会wa,以后做题注意
}
printf("%I64d\n",maxx);
}
return ;
}

tle的水代码。

include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define inf 0x3f3f3f3f
typedef __int64 ll;
using namespace std;
int n,w[];
ll dp[];
int main()
{
int minx;
ll maxx,zan;
while(scanf("%d",&n)!=EOF&&n!=)
{
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
memset(dp,,sizeof(dp));
dp[]=w[];
maxx=w[];
for(int i=;i<=n;i++)
{
minx=w[i];
for(int j=i-;j>=;j--)
{
minx=min(minx,w[j]);
zan=(i-j+)*minx;
dp[i]=max(dp[i],zan);
}
maxx=max(maxx,dp[i]);
}
printf("%I64d\n",maxx);
}
return ;

HDU1506: Largest Rectangle in a Histogram(最大子矩阵,好题动态优化左右边界)的更多相关文章

  1. NYOJ-258/POJ-2559/HDU-1506 Largest Rectangle in a Histogram,最大长方形,dp或者单调队列!

                                         Largest Rectangle in a Histogram 这么经典的题硬是等今天碰到了原题现场懵逼两小时才会去补题.. ...

  2. hdu---1506(Largest Rectangle in a Histogram/dp最大子矩阵)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  3. hdu1506——Largest Rectangle in a Histogram

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  4. hdu1506 Largest Rectangle in a Histogram

    Problem Description A histogram is a polygon composed of a sequence of rectangles aligned at a commo ...

  5. Largest Rectangle in a Histogram (最大子矩阵)

    hdu 1506 A histogram is a polygon composed of a sequence of rectangles aligned at a common base line ...

  6. HDU1506 Largest Rectangle in a Histogram (动规)

    Largest Rectangle in a Histogram Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  7. 【题解】hdu1506 Largest Rectangle in a Histogram

    目录 题目 思路 \(Code\) 题目 Largest Rectangle in a Histogram 思路 单调栈. 不知道怎么描述所以用样例讲一下. 7 2 1 4 5 1 3 3 最大矩形的 ...

  8. HDU-1506 Largest Rectangle in a Histogram【单调栈】

    Description A histogram is a polygon composed of a sequence of rectangles aligned at a common base l ...

  9. HDU1506 ( Largest Rectangle in a Histogram ) [dp]

    近期情绪太不稳定了.可能是由于在找实习这个过程碰壁了吧.第一次面试就跪了,可能是我面的是一个新公司,制度不完好,我感觉整个面试过程全然不沾编程,我面试的还是软件开发-后来我同学面试的时候.说是有一道数 ...

随机推荐

  1. 跟着百度学PHP[16]-验证码的学习

    一个验证码需要有以下步骤: 验证底图 验证码内容 生成验证码 对比校验 验证码需要依靠PHP的GD扩展库.一些集成环境是默认安装了GD拓展库. <?php //创建一个100*30px图片,默认 ...

  2. Model Binding is not working. MVC3 视图模型绑定不成功

    问题出现在POST方法中,当我要将数据提交到后台的时候,绑定的变量值为null 原因是视图中的名称跟Controller中的视图的名称不一致造成的. 假如你视图中的Model采用的是Html.Labe ...

  3. CI cookie 存放数组

      #ci cookie 由于不能存放数组,所有必须序列化之后在存入数组中 #定义数组 $cookie_array=array( 'shop_id'=>$gid, 'shop_name'=> ...

  4. Kmeans原理与实现

    原理 http://www.cnblogs.com/jerrylead/archive/2011/04/06/2006910.html 实现 http://www.cnblogs.com/zjutzz ...

  5. Django - 安装Ckeditor

    1. Ckedior.js CKEDITOR.editorConfig = function( config ) { // config.filebrowserUploadUrl="/blo ...

  6. windows连接远程打印机

    windows连接hp的远程打印机时,自动装不了驱动.. 需打开驱动程序(驱动程序安装需接设备),然后windows就过下载驱动这步了..

  7. vim 命令大全(写的非常全和好)http://blog.csdn.net/woshixiaosimao/article/details/54312738

    下文转自链接.由原作者陈皓译自<Learn ViM Progressively>,非常不错. ——————————正文开始—————————— 你想以最快的速度学习人类史上最好的文本编辑器 ...

  8. boost诊断工具BOOST_ASSERT、BOOST_VERIFY、BOOST_STATIC_ASSERT

    boost.assert提供的主要工具是BOOST_ASSERT宏,类似于C语言的assert,提供运行时的断言,但功能有所增强; 默认情况下,BOOST_ASSERT宏等同于assert宏: # d ...

  9. shell基础(三)

    函数 1.可以带function fun() 定义,也可以直接fun() 定义,不带任何参数: 2.参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值: 3.必须 ...

  10. php 使用curl 进行简单模拟提交表单

    //初始化curl $ch = curl_init(); $url = 'xxx'; $option = [ CURLOPT_URL => $url, CURLOPT_HEADER => ...