일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- string 메소드
- 입출력 패턴
- getline
- string 함수
- 시간복잡도
- 연결요소
- double ended queue
- k-eta
- vscode
- 구조체와 클래스의 공통점 및 차이점
- 엑셀
- 알고리즘 공부방법
- Django란
- 프레임워크와 라이브러리의 차이
- correlation coefficient
- iOS14
- Django의 편의성
- UI한글변경
- 매크로
- 입/출력
- 장고란
- scanf
- 자료구조
- 백준
- Django Nodejs 차이점
- c++
- 이분그래프
- 2557
- 표준 입출력
- EOF
Archives
- Today
- Total
Storage Gonie
챕터3-16. DP | 문제 풀이3 - (5) 백준 No.1912 : 연속합 본문
반응형
연속합 문제
- https://www.acmicpc.net/problem/1912
문제요약
n개의 정수로 이루어진 임의의 수열이 주어지면
이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하라.
ex) A = {10, -4, 3, 1, 5, 6, -35, 12, 21, -1}
연속된 수들의 합 중 가장 큰 값은 12 + 21 = 33
해결 방법
1. D[i] 정의
D[i] = "A[i]로 끝나는(까지 왔을 때의) 최대 연속합" 으로 정의할 수 있고,
A[i]로 끝나는 최대 연속합은 두가지의 경우가 될 수 있다.
1) A[i-1]로 끝나는 최대 연속합에 A[i]가 포함되는 경우 => D[i-1] + A[i]
2) A[i]가 새로운 수열의 합으로 시작하는 경우 => A[i]
그러면 D[i] = max (D[i-1] + A[i], A[i]) 가 된다.
@ 위의 점화식을 그림으로 이해하기 위한 예시
따라서 D의 최대값인 33이 정답이 된다.
<Bottom-up 방식>
(1)시간복잡도
= for 문의 반복 횟수
이 방법을 사용하면 N개의 칸을 채워야 하고, 한칸 D[i]의 값을 채울 때 비교는 D[i-1]+A[i]와 한번만 일어나므로
시간복잡도는 O(N)이 된다. 따라서 1중 for문으로 구현이 가능하다.
(2) 구현
-> 'for문을 이용한 반복문'으로 구현
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
int n;
cin >> n;
vector<int> a(n);
vector<int> d(n);
for (int i = 0; i < n; i++)
cin >> a[i];
d[0] = a[0];
for (int i = 1; i < n; i++)
d[i] = max(d[i-1] + a[i], a[i]);
cout << *max_element(d.begin(), d.end()) << "\n";
}
반응형
'알고리즘 > 알고리즘 기초(코드플러스)' 카테고리의 다른 글
챕터3-18. DP | 문제 풀이4 - (1) 백준 No.1699 : 제곱수의 합 (0) | 2019.05.17 |
---|---|
챕터3-17. DP | 문제 풀이3 - (6) 백준 No.2579 : 계단 오르기 (0) | 2019.05.16 |
챕터3-15. DP | 문제 풀이3 - (4) 백준 No.11054 : 가장 긴 바이토닉 부분 수열 (0) | 2019.05.15 |
챕터3-14. DP | 문제 풀이3 - (3) 백준 No.11722 : 가장 긴 감소하는 부분 수열 (0) | 2019.05.15 |
챕터3-13. DP | 문제 풀이3 - (2) 백준 No.11055 : 가장 큰 증가 부분 수열 (0) | 2019.05.15 |
Comments