BOJ/DP

[C/C++] 백준 - 2670번 : 연속부분최대곱

JWonK 2021. 8. 31. 21:18
728x90
반응형

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

 

2670번: 연속부분최대곱

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

www.acmicpc.net

문제

N개의 실수가 있을 때, 한 개 이상의 연속된 수들의 곱이 최대가 되는 부분을 찾아, 그 곱을 출력하는 프로그램을 작성하시오. 예를 들어 아래와 같이 8개의 양의 실수가 주어진다면,

색칠된 부분의 곱이 최대가 되며, 그 값은 1.638이다.

입력

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

출력

계산된 최댓값을 소수점 이하 넷째 자리에서 반올림하여 소수점 이하 셋째 자리까지 출력한다.

 

나의 약점인 DP를 공부 중인데 너무 어렵당. 실법문제인데도 어려워,,

이 문제는 각 idx에 최대값을 저장해주는데, 본래의 값 또는 그 전의 값과 현재의 값을 곱했을 때의 값을 비교해 항상 최대값을 저장시켜준다. 처음부터 끝까지,, 그럼 연속된 부분최대곱을 구할 수 있다

#include <iostream>
#include <list>
#include <queue>
#include <stack>
#include <string>
#include <cstring>
#include <vector>
#include <map>
#include <algorithm>
#include <cmath>
#include <bitset>
#define INF 98765432
#define CUNLINK ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
#define ll long long
#define ENDL cout << endl
#define endl '\n'

using namespace std;

double dp[10001];

int main() {
	CUNLINK;
	int N;
	cin >> N;
	vector<double> v(N + 1);
	for (int i = 1; i <= N; i++) cin >> v[i];

	dp[1] = v[1];
	double answer = dp[1];
	for (int i = 2; i <= N; i++) {
		dp[i] = max(v[i], dp[i - 1] * v[i]);
		answer = max(answer, dp[i]);
	}
	//for (int i = 1; i <= N; i++) cout << dp[i] << " ";
	cout << fixed;
	cout.precision(3);
	cout << answer << endl;
	return 0;
}
728x90
반응형

'BOJ > DP' 카테고리의 다른 글

[C/C++] 백준 - 1309번 : 동물원  (0) 2021.09.01
[C/C++] 백준 - 2491번 : 수열  (0) 2021.08.31
[C/C++] 백준 - 17626번 : Four Squares  (0) 2021.08.30
[C/C++] 백준 - 2294번 : 동전2  (0) 2021.08.30
[C/C++] 백준 - 11048번 : 이동하기  (0) 2021.08.30