HDU 1506 DP 动态规划思想
2015-08-10 20:10
363 查看
这个题有人用并查集A掉了,实在是服气。我是百度了之后,其实当时已经想到了思路,就差那临门一脚,然而卡了几个小时,最后还是看了别人的。惭愧惭愧,
说一下思路:之前的矩形是搜索最小的传送门,在此题中可以假定在这个状态时,这个矩形的高度已经是最小的,所以此处面积必定以他作为高度,那么我们只要向左搜索最高的
再记录下标,再向右寻找出最高的地方,并且记录下标。那么此时的面积必定为此状态的最大。可以用案例模拟。
说一下思路:之前的矩形是搜索最小的传送门,在此题中可以假定在这个状态时,这个矩形的高度已经是最小的,所以此处面积必定以他作为高度,那么我们只要向左搜索最高的
再记录下标,再向右寻找出最高的地方,并且记录下标。那么此时的面积必定为此状态的最大。可以用案例模拟。
<pre name="code" class="cpp">#include <iostream> #include <cstring> #include <cmath> #define MAX 100010 using namespace std; long long height[MAX]; long long dp[MAX]; long long l[MAX],r[MAX]; int main() { long long maxx; long long n; long long i,j; while(cin>>n&&n) { for(i = 1 ;i <= n ;i++) { cin>>height[i]; l[i]=r[i]=i; } // height[0] = height[n+1] = -1;//初始化,因为是从1,n开始向左右搜寻,如果改成2,n-1则不必 for(i = 2 ;i <= n ;i++) { while(height[l[i]-1]>=height[i]&&l[i] > 0)//向左寻找最高下标,l[i]>0此处缺少会超时 { l[i]=l[l[i]-1];//直接从刚才的最高点开始搜寻,可以跳过很多步骤,可以说是优化 } } for(i = n-1 ; i >= 1; i--) { while(height[i]<=height[r[i]+1]&&r[i] < n)//同上处,r[i] < n,此处缺少也会超时 { r[i]=r[r[i]+1]; } } maxx = -999999;//面积初始化 for(i = 1 ;i <= n ; i++) { if((r[i]-l[i]+1)*height[i]>maxx)//对每个面积进行比较,找出最大的 { maxx=(r[i]-l[i]+1)*height[i]; } } cout<<maxx<<endl; } return 0; }
相关文章推荐
- 简单介绍JS与JSP的区别
- WebService之WSDL文件讲解
- 1374 - Power Calculus (迭代加深+剪枝)
- 模拟退火——模板
- Excel格式导入导出数据(单语言版本)
- 计算几何模板 ——求多边形有多少条对称轴
- Excel格式导入导出数据(单语言版本)
- Ajax是什么
- HDOJ 1048 The Hardest Problem Ever
- 字符串hash
- Cocos2d-js 3.0 颜色变换(调整sprite/图片的色调)
- 确定天数 SDUT 2520
- Android 开发中 iBeacon的使用
- 交叉排序
- 初学数据库
- Java的package和import机制
- poj2001字典树
- 事件响应的优先级、stopProgapation禁止下层组件响应
- JVM学习笔记(四)------内存调优
- LintCode-Copy Books