[UVA1619]Feel Good[DP]
2015-08-05 01:16
363 查看
题目链接:[UVA1619]Feel Good[DP]
题意分析:求一个连续区间的最大值。定义:区间最大值 = 区间和 * 区间最小数。
解题思路:根据区间最大值的定义,我们可以枚举每个区间然后进行计算。然而显然是要超时的。这时可以考虑将每个数作为最小值,求出以其为最小值的区间的左值和右值。
以左值的更新为例:当当前值大于等于区间最小值时我们就向左更新,可以发觉,当前值如果比区间最小值大,那么以当前值作为最小值的区间的左值,当前区间肯定也能到达。
eg. 4 3 2 1 4 5 。以1为最小值的区间[1,6]。当更新的时候我们更新到左边的2,以2为最小值的区间为[1,3]这时就可以直接更新到1。这道题要注意下0存在的情况,特判下,另外有多个相同值需要输出最短的区间。
个人感受:这道题和[HDU1506]Largest
Rectangle in a Histogram[dp] 差不多,当时思维被固定了。听他们谈起线段树就以为是线段树才能解。。。。哎,感觉越来越不爱思考了T T
具体代码如下:
题意分析:求一个连续区间的最大值。定义:区间最大值 = 区间和 * 区间最小数。
解题思路:根据区间最大值的定义,我们可以枚举每个区间然后进行计算。然而显然是要超时的。这时可以考虑将每个数作为最小值,求出以其为最小值的区间的左值和右值。
以左值的更新为例:当当前值大于等于区间最小值时我们就向左更新,可以发觉,当前值如果比区间最小值大,那么以当前值作为最小值的区间的左值,当前区间肯定也能到达。
eg. 4 3 2 1 4 5 。以1为最小值的区间[1,6]。当更新的时候我们更新到左边的2,以2为最小值的区间为[1,3]这时就可以直接更新到1。这道题要注意下0存在的情况,特判下,另外有多个相同值需要输出最短的区间。
个人感受:这道题和[HDU1506]Largest
Rectangle in a Histogram[dp] 差不多,当时思维被固定了。听他们谈起线段树就以为是线段树才能解。。。。哎,感觉越来越不爱思考了T T
具体代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> using namespace std; const int MAXN = 1e5 + 111; typedef long long ll; int v[MAXN]; ll sum[MAXN], l[MAXN], r[MAXN]; int main() { int n; int cnt = 0; while( cin >> n ) { ll ansl = 0, ansr = 0, ansv = -1; memset(sum , 0, sizeof sum); for(int i = 0; i < n; ++i) cin >> v[i], l[i] = r[i] = i; for(int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + v[i - 1]; //记录前n项和 for(int i = 0; i < n; ++i) //更新左值 { while(v[i] != 0 && l[i] > 0 && v[l[i] - 1] >= v[i]) l[i] = l[l[i] - 1]; } for(int i = n - 1; i >= 0; --i)//更新右值 { while(v[i]!= 0 && r[i] < n - 1 && v[r[i] + 1] >= v[i]) //小心为0的情况,这时不进行更新区间 r[i] = r[r[i] + 1]; } for(int i = 0; i < n; ++i) { ll temp = (sum[r[i] + 1] - sum[l[i]]) * v[i]; if( temp > ansv ) { ansv = temp; ansl = l[i] + 1; ansr = r[i] + 1; } else if(temp == ansv && ansr - ansl > r[i] - l[i]) //注意题目条件 { ansl = l[i] + 1; ansr = r[i] + 1; } } if(cnt++) cout << '\n'; cout << ansv << '\n' << ansl << ' ' << ansr << '\n'; } return 0; }
相关文章推荐
- jQuery 仿百度输入标签插件
- BootStrap ifram,well
- BootStrap Panel
- CSS3 圆转动 特效
- 淘宝宝箱流量软件抽取方法(纯方法) 淘宝js研究
- JavaScript中基础变量和数据类型的定义
- mark---[jQuery Fancybox插件使用参数详解]
- BufferedInputStream 缓冲输入字节流 -------上
- 解决jQuery uploadify在非IE核心浏览器下无法上传
- JavaScript实现删除,移动和复制文件的方法
- js如何实现点击标签文字,文字在文本框出现
- JavaScript使用FileSystemObject对象写入文本文件内容的方法
- coffeescript使用的方式汇总
- 使用coffeescript编写node.js项目的方法汇总
- JavaScript节点及列表操作实例小结
- jquery实现实时改变网页字体大小、字体背景色和颜色的方法
- JS+CSS实现表格高亮的方法
- javascript禁止访客复制网页内容的实现代码
- JavaScript实现节点的删除与序号重建实例
- JavaScript计算某一天是星期几的方法