hdu 1506
2015-10-10 16:37
190 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1506
题意:求最大能截取的面积
用动态规划求,每块木板向左(向右)方向上,连续大于等于自己长度的最左(右)边的木板,记录编号
遍历所有木板求(right[i] - left[i])*num[i]的最大值,输出;
注意:木板的长度 要用long long或者_int64
num 2 1 4 5 1 3 3
left 1 1 3 4 1 6 6
right 1 7 4 4 7 7 7
题意:求最大能截取的面积
用动态规划求,每块木板向左(向右)方向上,连续大于等于自己长度的最左(右)边的木板,记录编号
遍历所有木板求(right[i] - left[i])*num[i]的最大值,输出;
注意:木板的长度 要用long long或者_int64
num 2 1 4 5 1 3 3
left 1 1 3 4 1 6 6
right 1 7 4 4 7 7 7
#include <stdio.h> #include <string.h> long long num[100010]; int r[100010]; int l[100010]; int main() { int n; int i,j; long long tmp,max; while(~scanf("%d",&n)) { if(n == 0) break; for(i = 1; i <= n; i++) { scanf("%lld",&num[i]); j = i-1; while(num[j] >= num[i] && j > 0) { if(num[l[j]] >= num[i]) j = l[j] - 1; } l[i] = j+1;//输入数据,同时求木板左的数据 } max = 0; for(i = n; i > 0; i--) { j = i+1; while(num[j] >= num[i] && j <= n) { if(num[r[j]] >= num[i]) j = r[j] + 1; } r[i] = j-1; tmp = (r[i]-l[i]+1)*num[i];//求木板右边的数据,同时求最大值 if(tmp > max) max = tmp; } printf("%lld\n",max); } return 0; }
相关文章推荐
- Object-c 类型转换
- Android内存优化神器——MAT使用进阶
- 程序员书单_架构设计篇
- Android M Runtime Permission 介绍
- c利用strtok来进行字符串分割
- 数据库中的批量操作
- 使Eclipse下支持编写HTML/JS/CSS/JSP页面的自动提示。
- shell自学笔记1
- linux目录结构
- Minimum Inversion Number(线段树)
- HDU 1702 STL
- UIWindow的一点儿思考
- HDU_5115 Dire Wolf
- 《探索需求》读书笔记一
- glib移植到ARM上
- qt-opencv配置mingw编译器
- 【小米校招笔试】一个数组是由有序数组经过n次循环移动后所得,请你用最快速度查找某个元素位置
- vi 删除^M
- Android内存优化神器——MAT入门使用
- 《探索需求》读书笔记一