728x90

문제

n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.

예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.

입력

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

출력

첫째 줄에 답을 출력한다.


연속으로 합했을 때 가장 큰 값이 뭔지 고르는 것이다.

점화식은 dp[N] = max( dp[N-1] + p[N], p[N])이다.

연속해서 합을 구하거나 합하지 않고 이번 차례부터 새로 더하는 경우 두가지가 되겠다.

 

 

코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/2020/%EC%97%B0%EC%86%8D%ED%95%A9%20(1912%EB%B2%88).cpp

 

chosh95/STUDY

프로그래밍 문제 및 알고리즘 정리. Contribute to chosh95/STUDY development by creating an account on GitHub.

github.com

 

C++ 코드

#include <iostream>
#include <algorithm>
using namespace std;
int N;
int p[100001];
int dp[100001];

int main()
{
	cin >> N;
	for (int i = 1; i <= N; i++) cin >> p[i];

	int res = p[1];
	for (int i = 1; i <= N; i++) {
		dp[i] = max(dp[i - 1] + p[i], p[i]);
		res = max(res, dp[i]);
	}
	
	cout << res;
}

 

728x90

+ Recent posts