알고리즘 모음(C++)

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

백준

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

공대생의 잡다한 사전 2023. 7. 26. 14:08

문제 링크입니다. https://www.acmicpc.net/problem/2670

 

2670번: 연속부분최대곱

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

www.acmicpc.net

연속된 수를 곱할 때, 나올 수 있는 최댓값을 구하는 문제입니다.

 

N은 10,000이하의 수이기에 2중 for문을 사용하면 시간초과가 생길 수 있습니다.

따라서 DP를 사용해서 지금까지 곱한 값의 최댓값을 저장해주면서 풀어나가면 됩니다.

 

문제를 풀기 위해 예시를 생각해보겠습니다.

4번까지 곱한 값의 최댓값을 구하기 위해선 2가지 방법이 있습니다.

1. 3번까지 곱한 값과 4번 자신의 값을 곱한다.

2. 4번 자신의 값을 그냥 가져온다.

1번과 2번 중, 더 큰값을 가져온다면 N번까지의 곱 중 가장 큰 값이 될 것입니다.

 

따라서 점화식은 다음과 같습니다.

   dp[i] = max(dp[i-1] * arr[i], arr[i]) 

 

자세한 것은 코드를 참고해주세요.

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
#include <string>
#include <cmath>

using namespace std;

int N;
double arr[10001];
double dp[10001];

void solve(){
    dp[1] = arr[1];
    for(int i = 2; i <= N; i++){
        dp[i] = max(dp[i-1]*arr[i], arr[i]);
    }
    double maxi = 0.0;
    for(int i = 1; i <= N; i++){
        maxi = max(maxi, dp[i]);
    }
    printf("%.3f", maxi);
}

int main(){
    cin.tie(0);
    cout.tie(0);
    cin >> N;
    for(int i = 1; i <= N; i++) cin >> arr[i];
    solve();
    return 0;
}

 

 

질문 및 조언은 댓글을 남겨주세요

'백준' 카테고리의 다른 글

백준 2302 - 극장 좌석(C++)  (0) 2023.07.27
백준 16395 - 파스칼의 삼각형(C++)  (0) 2023.07.26
백준 9656 - 돌 게임2(C++)  (0) 2023.07.24
백준 9507 - Generations of Tribbles(C++)  (0) 2023.07.24
백준 2491 - 수열(C++)  (0) 2023.07.24