Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- //find the longest switching array.
- typedef struct{
- int lengthMaxSwitching;
- int oddElem;
- int evenElem;
- } rt;
- rt h_solution(vector<int> &A, int index, unordered_map<int, rt> &memo){
- //returns maximum switching array ending at index;
- rt to_return;
- if(memo.count(index)){
- return memo[index];
- }
- if(index == 0){
- to_return.lengthMaxSwitching = 1;
- to_return.oddElem = A[index];
- to_return.evenElem = INT_MAX;
- memo[index] = to_return;
- return to_return;
- }
- if(index == 1){
- to_return.lengthMaxSwitching = 2;
- to_return.oddElem = A[0];
- to_return.evenElem = A[1];
- memo[index] = to_return;
- return to_return;
- }
- rt L = h_solution(A, index-1, memo);
- if(L.lengthMaxSwitching % 2 == 0){
- //i.e current element will be at odd position
- if(A[index]==L.oddElem){
- to_return = L;
- to_return.lengthMaxSwitching+= 1;
- memo[index] = to_return;
- return to_return;
- }
- else{
- to_return.lengthMaxSwitching = 2;
- to_return.evenElem = A[index];
- to_return.oddElem = A[index-1];
- memo[index] = to_return;
- return to_return;
- }
- }
- else{
- //ie current element will be at even position
- if(A[index]==L.evenElem){
- to_return = L;
- to_return.lengthMaxSwitching += 1;
- memo[index] = to_return;
- return to_return;
- }
- else{
- to_return.lengthMaxSwitching = 2;
- to_return.evenElem = A[index];
- to_return.oddElem = A[index-1];
- memo[index] = to_return;
- return to_return;
- }
- }
- }
- int solution(vector<int> &A){
- if(A.size()<=2) return A.size();
- unordered_map<int, rt> memo;
- int answer = 0;
- for(int i=0; i<A.size(); i++){
- answer = max(answer, h_solution(A, i, memo).lengthMaxSwitching);
- }
- return answer;
- }
- int main() {
- vector<int> sample = {7,-5, -5, -5, 7, -1, 7};
- cout << solution(sample) << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement