1、京东OJ 保卫方案 (单调栈)
http://www.cnblogs.com/mengmz/p/7263915.html
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <vector> #include <algorithm> using namespace std; struct node{ int val; long count; node(int v, int c = 1): val(v), count(c){} }; int main() { int N; while(cin >> N){ vector<int> watch(N); for(int i = 0; i < N; ++i) cin >> watch[i]; vector<node> v; node tmp(watch[0]); int max_h = watch[0]; int max_index = 0; for(int i = 1; i < N; ++i){ if(watch[i] == watch[i - 1]) tmp.count ++; else{ v.push_back(tmp); if( max_h < tmp.val){ max_h = tmp.val; max_index = v.size() - 1; } tmp.val = watch[i]; tmp.count = 1; } } // 最后一个元素 v.push_back(tmp); if( max_h < tmp.val){ max_h = tmp.val; max_index = v.size() - 1; } int n = 0; long count = 0; vector<node> stack; for(int i = max_index; n < v.size(); ++n, i = (i+1)%v.size()){ while( stack.size() && v[i].val > stack[stack.size() - 1].val){ node & tmp = stack[stack.size() - 1]; count += 2 * tmp.count + tmp.count*(tmp.count - 1)/2; stack.pop_back(); } if( stack.size()){ if(v[i].val == stack[stack.size() - 1].val) stack[stack.size() - 1].count += v[i].count; else stack.push_back(v[i]); } else stack.push_back(v[i]); } while(stack.size()){ node & tmp = stack[stack.size() - 1]; count += tmp.count*(tmp.count - 1)/2; stack.pop_back(); if(stack.size()) count += 2 * tmp.count; if(stack.size()==1 &&stack[stack.size()-1].count==1) count-=tmp.count; } cout << count<<endl; } return 0; }
2、2018 上海交大7月保研夏令营机试最后一题(最长子序列)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> using namespace std; int findMax(int arr[], int p) { if (p == 0) return 0; int *maxArr = new int[p]; maxArr[0] = arr[0]; int len = 1; for (int i = 1; i < p; i++) { for (int j = len - 1; j >= 0; j--) { if (arr[i] > maxArr[j]) { if (j == len -1) { maxArr[len] = arr[i]; len++; } else { maxArr[j + 1] = arr[i]; } } else if (j == 0) { maxArr[0] = arr[j]; } } } for (int i = len - 1; i >= 0; i--) { if (arr[p] > maxArr[i]) { delete [] maxArr; return i + 1; } } delete [] maxArr; return 0; } int main() { int n; cin >> n; int *numbers = new int[n]; int *numbers_rev = new int[n]; for (int i = 0; i < n; i++) { cin >> numbers[i]; } int incLen, decLen, tmp, maxLen = 0; for (int i = 0; i < n; i++) { numbers_rev[i] = numbers[6-i]; } for (int i = 0; i < n; i++) { incLen = findMax(numbers, i); decLen = findMax(numbers_rev, n - i - 1); tmp = (incLen > decLen) ? decLen : incLen; if (2 * tmp + 1 > maxLen) { maxLen = 2 * tmp + 1; } } cout << maxLen << endl; delete [] numbers; delete [] numbers_rev; return 0; }