ABOUT ME

문제의 간단한 해법과 함께 어떤 방식으로 접근했는지, 그리고 문제의 해법을 찾는데 결정적이었던 깨달음은 무엇이었는지

Today
Yesterday
Total
  • 백준 2104번 부분배열 고르기
    PS 2021. 4. 14. 18:54

    www.acmicpc.net/problem/2104

     

     

     

     

    <접근방법>

    왼쪽 부분, 오른쪽  부분, 가운데 부분 중에서 최대값을 찾는다.

     


     

     

     

    <코드>

    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    #define MAX 100001
    #define INF 987654321
    
    
    int n;
    long long A[MAX];
    
    long long solve(int left, int right) {
    	if (left == right) return A[left] * A[left];
    
    	int mid = (left + right) / 2;
    
    	long long res = max(solve(left, mid), solve(mid + 1, right));
    
    	int low = mid;
    	int high = mid+1;
    	long long m = min(A[low], A[high]);
    	long long sum = A[low] + A[high];
    
    	res = max(res, (sum * m));
    
    	while (left < low || high < right) {
    		if (high < right && (low == left || A[low-1] < A[high+1])) {
    			high++;
    			m = min(m, A[high]);
    			sum += A[high];
    		}
    		else {
    			low--;
    			m = min(A[low], m);
    			sum += A[low];
    		}
    		res = max(res, sum * m);
    	}
    	
    	return res;
    }
    
    int main() {
    	cin >> n;
    	for (int i = 0; i < n; i++) {
    		cin >> A[i];
    	}
    
    	cout << solve(0, n-1) << '\n';
    
    	return 0;
    }

     

     

     

     

     

     

     

    반응형

    'PS' 카테고리의 다른 글

    백준 1030번 프렉탈 평면  (0) 2021.04.14
    백준 1725번 히스토그램  (0) 2021.04.14
    백준 5904번 Moo게임  (0) 2021.04.08
    백준 10830번 행렬 제곱  (0) 2021.04.08
    백준 20164 홀수 홀릭 호석  (0) 2021.04.08
Designed by Tistory.