키베이루's diary

[C++] 백준 1912번 연속합 본문

알고리즘/DP

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

키베이루 2022. 5. 18. 16:23

 

1) 문제설명

백준 Online Judge 1912번 연속합

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

 

1912번: 연속합

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

www.acmicpc.net

 

2) 해결방법

 

입력값 :

2 -> 최대 2

2, 1 -> 최대 2+1 =3

2, 1, -4 -> 최대 2+1 =3

2, 1, -4, 3 -> 최대 2+1 =3 or 3

2, 1, -4, 3, 4 -> 최대 3+4 =7

이와 같이 생각했을 때 (지금까지 입력받았던 합중 최댓값) vs (새로 입력받은 숫자) 중 큰 것으로 dp를 설계하면 된다.

 

3) 코드

#include<iostream>
#include<queue>
#include<string.h>
#include<math.h>
#include<cmath>
#include<algorithm>

using namespace std;

int dp[1000001];

/*
연속합
해결방안
dp[] : 숫자들을 연속해서 하나씩 더한 것 vs 새로운 숫자


*/

int main() {
	int n, sum = 0;
	int arr[100001];
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> arr[i];
	}
	
	dp[0] = arr[0];
	int maxt = arr[0];
	for (int i = 1; i < n; i++) {
		
		dp[i] = max(dp[i - 1] + arr[i], arr[i]);
		if (dp[i] >  maxt) {
			maxt = dp[i];
		}
	}
	cout << maxt;
}

 

DP의 점화식을 세우는 것이 쉽지 않다.

'알고리즘 > DP' 카테고리의 다른 글

[C++] 백준 1932번 정수 삼각형  (0) 2022.06.03
[C++] 백준 1149번 RGB거리  (0) 2022.06.03
[C++] 백준 2156번 포도주 시식  (0) 2022.06.02
[C++] 백준 10844번 쉬운 계단 수  (0) 2022.06.02
[C++] 백준 1463번 1로 만들기  (0) 2022.05.18
Comments