반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 백준
- 리트코드
- 제노블레이드 2
- C++
- LeetCode
- 자소서
- python3
- baekjoon
- Pro-Con
- Github
- 프로콘 갈림현상
- Python
- 백트래킹
- 알고리즘
- 알고리즘 종류 정리
- ASF-110
- 네이버 검색 시스템
- Algorithmus
- 코딩테스트
- algorithm
- SRE
- Ultimate Search
- 격리수준
- GitHub Desktop
- programmers
- git
- 프로그래머스
- DP
- 취준
- 프로콘
Archives
- Today
- Total
산타는 없다
[백준 / BAEKJOON] 1912번 연속합 - C++ 본문
반응형
문제 원문
조건
시간 제한 : 1초
메모리 제한 : 128 MB문제
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[i] = max(Arr[i], Arr[i] + DP[i-1])
입니다.
현제값이 누적한 값보다 크다면 더할 이유가 없기 때문에 누적해서 더하지 않고 현제값으로 초기화하여 최댓값을 구합니다.
성공 코드
#include <vector>
#include <iostream>
#include <limits>
#include <algorithm>
#include <cmath>
#include <string>
using namespace std;
int main()
{
int nSize;
cin >> nSize;
vector<int> vArr(nSize);
vector<int> vDp(nSize);
for (int i = 0; i < nSize; i++)
{
cin >> vArr[i];
}
int nMax = vArr[0];
vDp[0] = vArr[0];
for (int i = 1; i < nSize; i++)
{
vDp[i] = max(vArr[i], vArr[i] + vDp[i - 1]);
if (nMax < vDp[i])
nMax = vDp[i];
}
cout << nMax << '\n';
return 0;
}
결과
Github - github.com/ledpear
반응형
'코딩테스트 > 백준' 카테고리의 다른 글
[백준 / BAEKJOON] 13305번 주요소 - C++ (0) | 2021.01.24 |
---|---|
[백준 / BAEKJOON] 9251번 LCS - C++ (0) | 2021.01.23 |
[백준 / BAEKJOON] 2580번 스도쿠 - C++ (0) | 2021.01.21 |
[백준 / BAEKJOON] 10814번 나이순 정렬 - C++ (0) | 2021.01.12 |
[백준 / BAEKJOON] 10757번 큰 수 A+B - C++ (0) | 2021.01.10 |
Comments