算法问题实战策略 FENCE
Posted itdef
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法问题实战策略 FENCE相关的知识,希望对你有一定的参考价值。
地址 https://algospot.com/judge/problem/read/FENCE
开始考虑暴力遍历
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <algorithm> 5 6 using namespace std; 7 8 int n; 9 int m; 10 11 vector<int> h; 12 13 int func() 14 { 15 int ret = 0; 16 17 for (int i = 0; i < h.size(); i++) { 18 int minHeight = h[i]; 19 for (int j = i; j < h.size(); j++) { 20 minHeight = min(minHeight,h[j]); 21 ret = max(ret, (j - i + 1)*minHeight); 22 } 23 } 24 25 return ret; 26 } 27 28 int main() 29 { 30 cin >> n; 31 32 while (n--) { 33 h.clear(); 34 m = 0; 35 cin >> m; 36 37 for (int i = 0; i < m; i++) { 38 int t; 39 cin >> t; 40 h.push_back(t); 41 } 42 43 cout << func() << endl; 44 } 45 46 return 0; 47 }
后面优化 采取分冶的办法 最大值要么在左边 要么在右边 要么经过左右 三种情况。
左右两种情况采取递归的方式进行计算
穿越分界由左到右的情况则采用以下方法计算:
取中间两块木板 长方形长度为2 高度为两筐木板短的那块,然后向两边扩展,选取左边或者右边较高的那块木板扩展.每次扩展计算面积,记录当前最大面积。最后得到穿越分界由左到右的最大面积
之所以会取较高的木板扩展是因为面积要以最低的高度计算 如果两边扩展不取较高的而是取较低的木板 那么如果扩展的木板低于当前高度 会遗漏一些情况未计算面积 从而产生错误.
代码如下:
1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <algorithm> 5 6 using namespace std; 7 8 9 int n; 10 int m; 11 vector<int> h; 12 int solve(int left, int right) 13 { 14 if (left == right) return h[left]; 15 int mid = (left + right) / 2; 16 int ret = max(solve(left, mid), solve(mid + 1, right)); 17 18 int lo = mid, hi = mid + 1; 19 int height = min(h[lo], h[hi]); 20 ret = max(ret, height * 2); 21 while (left < lo || hi < right) { 22 if (hi < right && (lo == left || h[lo - 1] < h[hi + 1])) { 23 ++hi; 24 height = min(height,h[hi]); 25 } 26 else { 27 --lo; 28 height = min(height,h[lo]); 29 } 30 ret = max(ret, height*(hi - lo + 1)); 31 } 32 return ret; 33 } 34 35 36 int main() 37 { 38 cin >> n; 39 40 while (n--) { 41 h.clear(); 42 m = 0; 43 cin >> m; 44 for (int i = 0; i < m; i++) { 45 int t; 46 cin >> t; 47 h.push_back(t); 48 } 49 50 cout << solve( 0, m-1) << endl; 51 } 52 53 return 0; 54 }
以上是关于算法问题实战策略 FENCE的主要内容,如果未能解决你的问题,请参考以下文章