zoukankan      html  css  js  c++  java
  • hdu 1506(dp求最大子矩阵)

    题意:容易理解...

    分析:对于每个单位矩阵,我们先求出连续比它高的最左边的下标假设为l,然后求出比它高的最右边的下标假设为r,然后矩阵的面积就是(r-l+1)*1;我们从左到

    右扫一遍,求出每个点的l保存在l[]数组里,然后从右到左扫一遍,求出每个点的r保存在r[]数组里,最后可以求出最大的矩阵了。

    然后做完这个题可以做下这道题的加强版--hdu 1505 我的博客链接:http://www.cnblogs.com/jiangjing/p/3221442.html

    代码实现:

    #include<stdio.h>
    #include<string.h>
    __int64 a[100005],dp[100005],l[100005],r[100005];
    int main()
    {
       __int64 n,i,t,max;
       while(scanf("%I64d",&n)!=EOF&&n)
       {
          max=-1;
          for(i=1;i<=n;i++)
             scanf("%I64d",&a[i]);
          l[1]=1;r[n]=n;
          for(i=2;i<=n;i++)//求每个点左边连续比它大的最左边的下标,保存在l[]数组里
          {
              t=i;
              while(t>1&&a[i]<=a[t-1]) 
                  t=l[t-1];
              l[i]=t;
          }
          for(i=n-1;i>=1;i--)//求每个点右边连续比它大的最右边的下标,保存在r[]数组里
          {
              t=i;
              while(t<n&&a[i]<=a[t+1])
                  t=r[t+1];
              r[i]=t;
          }
          for(i=1;i<=n;i++)
              if((r[i]-l[i]+1)*a[i]>max)
                  max=(r[i]-l[i]+1)*a[i];
          printf("%I64d
    ",max);
       }
       return 0;
    }
  • 相关阅读:
    正则表达式
    网络编程
    多线程
    IO—Data
    IO-对象流
    IO-转换流
    异常
    常用类——File——Random——Math——枚举
    每月博客-20180310
    每月博客-20180204
  • 原文地址:https://www.cnblogs.com/jiangjing/p/3221423.html
Copyright © 2011-2022 走看看