본문 바로가기

백준

[백준/c++] BOJ 2670 - 연속부분최대곱

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

 

2670번: 연속부분최대곱

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

www.acmicpc.net

 

문제 설명

N개의 실수가 있을 때, 한 개 이상의 연속된 수들의 곱이 최대가 되는 부분을 찾아, 그 곱을 출력한다.

N은 10000 이하의 자연수이며, 실수는 0.0보다 크거나 같고, 9.9보다 작거나 같다.

해결

dp[n] : n번까지의 연속곱의 최대곱

 

dp[1] = arr[1]

dp[2] = arr[2] * dp[1] || arr[2]

...

dp[n] = arr[n] * dp[n-1] || arr[n]

 

=> n - 1번까지의 최대곱 * n번 값 or n번 곱 중 큰 것이 dp[n]이 

코드

#include<bits/stdc++.h>
#define x first
#define y second
#define INF 1e9
using namespace std;

int n;
double arr[10005], answer = 0.0;
double dp[10005];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n;
    for (int i = 0; i < n; i++)
        cin >> arr[i];

    dp[0] = arr[0];

    for (int i = 1; i < n; i++) {
        dp[i] = max(dp[i - 1] * arr[i], arr[i]);
        answer = max(answer, dp[i]);
    }

    cout.precision(3);
    cout << fixed;
    cout << answer;
}

 

참고로 소숫점 3자리까지만 출력하고 싶다면 

    cout.precision(3);
    cout << fixed;

이 두 줄을 써 주면 된다.

 

cout.precision(3); 만 쓰면 정수 부분을 합쳐 3자리를 출력한다.