본문 바로가기

프로그래밍/PS

[C++] 백준 1912번: 연속합

반응형

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

 

1912번: 연속합

첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.

www.acmicpc.net

 

오답 풀이

먼저, 누적합 배열을 계산했다.

그리고 누적합 배열에서 최소값과 최대값을 찾았다.

최소값보다 뒤에 있는 요소 중에 최대값을 찾고,

최대값보다 앞에 있는 요소 중에 최소값을 찾았다.

그리고 그 두 경우에서의 차 중 큰 값을 답으로 출력했다.

그리고 틀렸다.

정답 풀이

https://sihyungyou.github.io/baekjoon-1912/

 

백준 1912번 : 연속합

BOJ

sihyungyou.github.io

위 풀이를 봤다. 음...

https://guiyum.tistory.com/16

 

C++ 백준 1912번

백준 1912번 www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거..

guiyum.tistory.com

위 풀이도 봤다. 지난 학기 알고리즘 수업 시간에 다뤘던 유형이다.

매우 대표적인 DP 문제이므로 잘 기억해둬야겠다.

#include <bits/stdc++.h>

using namespace std;

#define FOR(i, N)	for(int i = 0; i < N; ++i)
#define TC(T)		int T; cin >> T; while(T--)
#define FAST_IO		cin.tie(NULL); ios::sync_with_stdio(false);
#define ERR			1e-13
#define EL			"\n"
#define VI			vector<int>
#define VVI			vector<VI>
#define VVVI		vector<VVI>
#define VP			vector<pair<int, int>>
#define VVP			vector<VP>
#define VC			vector<char>
#define VVC			vector<VC>
#define VB			vector<bool>
#define VVB			vector<VB>
#define VVVB		vector<VVB>

int main() {
#ifdef DEBUG
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#endif
	FAST_IO;

	int N;
	cin >> N;
	VI seq(N);
	FOR(i, N)
		cin >> seq[i];

	VI DP(N);
	DP[0] = seq[0];
	for (int i = 1; i < N; i++) {
		DP[i] = DP[i - 1] + seq[i];
		if (DP[i] < seq[i])
			DP[i] = seq[i];
	}

	cout << *max_element(DP.begin(), DP.end()) << EL;

	return 0;
}
반응형