hdu1506 经典dp
来源:互联网 发布:淘宝仓管的工作 编辑:程序博客网 时间:2024/05/20 06:10
hdu1506 经典dp
刚开始刷dp的题,看到这题,就知道是dp题,因为我就是因为这是dp题才来做的,我知道这是dp题,然后就没了,
一脸懵逼啊 做了几道背包dp,一做不是背包题就不会做了 ,只知道设f[i],f[i]代表的意思都是错的,
在做这种题时我只知道直接用状态直接求解答案,然而。。。。开始时连问题都没有搞清楚,开始时应该搞清楚解题步骤 因该清晰去推倒答案 一步一步的解 比如说这个题 问题是求最大面积 首先是高和宽 最直白解就是枚举每个点 然后判断前后有多少个连续高于他的下标,由于数字大 ,不能有普通法 所以要用dp记忆 while(tt>1&&a[i]<=a[tt-1]) tt=l[tt-1]; l[i]表示左左边连续大于啊a[i]的下标
这个其实在kmp中有所体现 居然没有想到(哭)
#include<iostream>#include<cstdlib>#include<stdio.h>#define LL long long#define Max(a,b) a>b?a:busing namespace std;const int N=100010;LL a[N],l[N],r[N],maxn,s;int main(){ int n; while(scanf("%d",&n) && n) { for(int i=1;i<=n;i++) scanf("%I64d",&a[i]); l[1]=1;r[n]=n; for(int i=2;i<=n;i++) { int tt=i; while(tt>1&&a[i]<=a[tt-1]) tt=l[tt-1];///dp思想 l[i]=tt; } for(int i=n-1;i>=1;i--) { int tt=i; while(tt<n&&a[i]<=a[tt+1]) tt=r[tt+1]; r[i]=tt; } maxn=0; for(int i=1;i<=n;i++) maxn=Max(maxn,(r[i]-l[i]+1)*a[i]); printf("%I64d\n",maxn); } return 0;}
1 0
- hdu1506 经典dp
- hdu1506 dp
- hdu1506 水水的dp
- hdu1506
- HDU1506
- HDU1506
- HDU1506
- 【DP】 hdu1506 Largest Rectangle in a Histogram
- HDU1505-----DP?HDU1506的加强版
- HDU1506 ( Largest Rectangle in a Histogram ) [dp]
- hdu1506 1505 2870最大子矩形 DP
- hdu1506 Largest Rectangle in a Histogram (DP)
- [HDU1506]Largest Rectangle in a Histogram[dp]
- hdu1506直方图中的最大长方形(dp)
- DP激情奉献(三)hdu1506状图选最大矩形
- HDU1506------据说是DP,我更觉得是简单的枚举
- HDU1506 Largest Rectangle in a Histogram(简单DP)
- HDU1505 City Game (DP,HDU1506加强版)
- Julia: 一行代码可以写出什么优雅?
- 二叉树的创建与销毁
- 金融黑洞理论
- 1622-构造二叉树
- 用树莓派学编程系列1——树莓派状态读取
- hdu1506 经典dp
- Unix新手教程
- javac编译错误: 编码UTF8/GBK的不可映射字符
- C#和C++结构体Socket通信
- 利用栈将十进制转换为二进制
- listview的监听事件
- <21天实战caffe>第8章程序编译问题
- 数据结构的链式存储结构
- 【JZOJ4812】string