Doby's Lab

백준 2670번: 연속부분최대곱 (C++) 본문

PS/BOJ

백준 2670번: 연속부분최대곱 (C++)

도비(Doby) 2022. 6. 7. 22:49

https://www.acmicpc.net/problem/2670

 

2670번: 연속부분최대곱

첫째 줄은 나열된 양의 실수들의 개수 N이 주어지고, 그 다음 줄부터 N개의 수가 한 줄에 하나씩 들어 있다. N은 10,000 이하의 자연수이다. 실수는 소수점 첫째자리까지 주어지며, 0.0보다 크거나

www.acmicpc.net


Solved By: DP

 

풀면서 Brute-Force 한 느낌이 들었습니다. 모든 시작점부터 n까지 다 곱해가면서 시작점마다 최댓값을 구하고, 또한 그 최댓값 N개 중에서도 최댓값을 구해야 합니다.

#include <iostream>
#define MAX 10001
using namespace std;

double arr[MAX];
double cache[MAX];
int n;

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> arr[i];
    }
    
    double result = 0;
    
    // O(N^2) = O(100,000,000)
    for(int i = 1; i <= n; i++){
        double tmp = 1;
        double maxValue = 0;
        for(int j = i; j <= n; j++){
            tmp *= arr[j];
            maxValue = max(maxValue, tmp);
        }
        cache[i] = maxValue;
        result = max(result, maxValue);
    }
    
    cout.precision(3);
    cout << fixed;
    
    cout << result << '\n';
    return 0;
}

 

728x90