본문 바로가기
Programming Solve/BOJ

BOJ 1912 (C++)

by msm1029 2020. 11. 29.
반응형

1. 문제

2. 아이디어

Dynamic Programming은 점화식만 세우면 80~90%는 풀었다고 할 수 있다.

연속된 몇 개의 수의 합 중 최댓값을 구하는 문제이므로 현재값과 누적된 값 + 현재값 중 어떤 것이 더 큰지

비교해보면 답을 구할 수 있을 것이다.

-> 만약 누적된 값에 현재값을 더한 것보다 그냥 현재값이 더 크다면 현재값부터 다시 더해나가는것이

더 큰 값이 될것이다 라는 아이디어이다.

 

점화식을 세우면 DP[i] = max(arr[i], DP[i-1] + arr[i]) 이고

 

예제 1의 케이스로 보면 

arr [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]
     10  -4    3   1     5   6  -35  12   21  -1

DP [0]  [1]  [2]  [3]  [4]  [5]  [6]  [7]  [8]  [9]
     10    6   9   10  15   21  -14 12  33  32

 

와 같이 DP[8]에서 정답을 구할 수 있다.

 

3. 소스코드

#include <iostream>
#include <algorithm>
using namespace std;
long long arr[100001];
long long DP[100001];
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n;
	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(arr[i], DP[i - 1] + arr[i]);
	}
	cout << *max_element(DP + 0, DP + n);
}

 

값을 입력받는 arr 배열과 연속된 합을 저장하는 DP 배열을 선언하고 값을 입력받는다.

*main문의 윗 두 줄은 C++의 입출력속도를 향상시키기 위한 것이다.

 

그 다음 DP[0]에 arr[0]값을 넣어두고 1부터 n까지 앞서 세운 점화식에 의해 DP 배열을 채워나간다.

마지막으로 DP 배열의 0번째 주소부터 n번째 주소까지의 최댓값을 출력한다.

반응형

'Programming Solve > BOJ' 카테고리의 다른 글

BOJ 20953 / C++  (0) 2021.03.02
BOJ 11558 The game of death / C++  (0) 2021.02.12
BOJ 15312 이름 궁합 / C++  (0) 2021.02.11
BOJ 2445 / C++  (0) 2021.02.07
BOJ 1475 (C++)  (0) 2020.12.01