博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2559 Largest Rectangle in a Histogram(DP二维超内存,用一维或者用结构体)
阅读量:4037 次
发布时间:2019-05-24

本文共 3361 字,大约阅读时间需要 11 分钟。

1、

2、题目大意:

给出n个矩形并排,给出他们的高度,求可以在此基础上找出一个面积最大且底边在基线上的矩形,输出最大面积

一开始用的区间DP,样例都过了,但发现dp[N][N]超内存了,看网上代码,居然是用结构体或两个一维数组表示的

3、题目:

Largest Rectangle in a Histogram
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 13118   Accepted: 4238

Description

A histogram is a polygon composed of a sequence of rectangles aligned at a common base line. The rectangles have equal widths but may have different heights. For example, the figure on the left shows the histogram that consists of rectangles with the heights 2, 1, 4, 5, 1, 3, 3, measured in units where 1 is the width of the rectangles:
Usually, histograms are used to represent discrete distributions, e.g., the frequencies of characters in texts. Note that the order of the rectangles, i.e., their heights, is important. Calculate the area of the largest rectangle in a histogram that is aligned at the common base line, too. The figure on the right shows the largest aligned rectangle for the depicted histogram.

Input

The input contains several test cases. Each test case describes a histogram and starts with an integer
n, denoting the number of rectangles it is composed of. You may assume that
1<=n<=100000. Then follow
n integers
h1,...,hn, where
0<=hi<=1000000000. These numbers denote the heights of the rectangles of the histogram in left-to-right order. The width of each rectangle is
1. A zero follows the input for the last test case.

Output

For each test case output on a single line the area of the largest rectangle in the specified histogram. Remember that this rectangle must be aligned at the common base line.

Sample Input

7 2 1 4 5 1 3 34 1000 1000 1000 10000

Sample Output

84000

Hint

Huge input, scanf is recommended.

Source

4、AC代码:

#include
#include
#include
#include
#include
using namespace std;#define ll long long#define N 100005struct node{ ll num; ll left; ll right;} a[N];int main(){ int n; while(scanf("%d",&n)!=EOF) { if(n==0) break; for(int i=1; i<=n; i++) { scanf("%lld",&a[i].num); a[i].left=i; a[i].right=i; } a[0].num=-1; a[n+1].num=-1; for(int i=1; i<=n; i++) { while(a[i].num<=a[a[i].left-1].num) a[i].left=a[a[i].left-1].left; } for(int i=n; i>=1; i--) { while(a[i].num<=a[a[i].right+1].num) a[i].right=a[a[i].right+1].right; } ll tmp=-1; for(int i=1; i<=n; i++) { if(a[i].num*(a[i].right-a[i].left+1)>tmp) tmp=a[i].num*(a[i].right-a[i].left+1); } printf("%lld\n",tmp); } return 0;}
区间DP做的,超内存的代码:

#include
#include
#include
#include
#include
using namespace std;#define N 100005#define INF 1000000005int a[N];int dp[22005][22005];int main(){ int n; while(scanf("%d",&n)!=EOF) { if(n==0) break; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); dp[i][i]=a[i]; } for(int i=2;i<=n;i++) { for(int j=1;j+i-1<=n;j++) { int s=j; int e=j+i-1; int minn=INF; for(int k=s;k<=e;k++) { if(a[k]

转载地址:http://xgddi.baihongyu.com/

你可能感兴趣的文章
CCF 分蛋糕
查看>>
解决python2.7中UnicodeEncodeError
查看>>
小谈python 输出
查看>>
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
查看>>
python:如何将excel文件转化成CSV格式
查看>>
Django 的Error: [Errno 10013]错误
查看>>
机器学习实战之决策树(一)
查看>>
机器学习实战之决策树二
查看>>
[LeetCode By Python]7 Reverse Integer
查看>>
[leetCode By Python] 14. Longest Common Prefix
查看>>
[leetCode By Python]111. Minimum Depth of Binary Tree
查看>>
[LeetCode By Python]118. Pascal's Triangle
查看>>
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
[LeetCode By Python]122. Best Time to Buy and Sell Stock II
查看>>
[LeetCode By Python]125. Valid Palindrome
查看>>
[LeetCode By Python]136. Single Number
查看>>
[LeetCode By MYSQL] Combine Two Tables
查看>>
如何打开ipynb文件
查看>>
[Leetcode BY python ]190. Reverse Bits
查看>>
Android下调用收发短信邮件等(转载)
查看>>