일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 8-Puzzle
- Flyweight Pattern
- Bronze
- trie
- programmers
- Unity
- BOJ
- PrefixSum
- 프로세스 상태
- SWEA
- BFS
- Project
- level3
- level1
- Silver
- algorithm
- LEVEL2
- Zenject
- 3D RPG
- 프로그래머스
- solid 원칙
- Modern C++
- two pointer
- dirtyflag pattern
- knapsack Problem
- effective C++
- binary search
- Euclidean
- Gold
- stack
Archives
- Today
- Total
Patrick's Devlog
[BOJ/C++] 연속합(1912번) 본문
1. 개요
https://www.acmicpc.net/problem/1912
1-1. 설명
n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇개의 수를 선택해 구할 수 있는 합 중 가장 큰 합을 구하려 한다. 단, 수는 한 개이상 선택해야 한다.
1-2. 제한 사항
- 첫 줄에 정수 n이 주어지며, n은 1 이상 100,000 이하
- 둘째 줄에는 n개의 정수로 이루어진 수열이 주어지며, 수는 -1,000 이상 1,000 이하
2. 구현
2-1. 풀이
시간 제한이 1초이므로, 단순히 브루트포스를 이용하면 당연히 시간초과가 난다. DP를 이용해서 풀면 될것 같았는데, 점화식이 자꾸 틀리는 것 같아 식은 다른 사람의 풀이를 참조하였다. DP 연습을 조금 더 해야할 것 같다.
2-2. 코드
#include <iostream>
#include <algorithm>
using namespace std;
constexpr size_t MAX_NUM = 100000;
int nums[MAX_NUM];
int main() // 1912
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
// n개의 정수로 이루어진 임의 수열 주어짐
// 이중 몇개 수를 선택해 가장 큰 합 구함
int N, maxNum;
cin >> N;
for (int i = 0; i < N; i++) cin >> nums[i];
maxNum = nums[0];
// DP Bottom-up
// 이전 합 + 현재수 합과 현재수를 비교하여 더 큰 것을 선택
// 이전 합 + 현재수 > 현재수 -> 현재 숫자를 이전 합에 포함
// 이전 합 + 현재수 < 현재수 -> 현재 숫자로 새로 합을 생성
for (int i = 1; i < N; i++) {
nums[i] = max(nums[i], nums[i - 1] + nums[i]);
if (maxNum < nums[i]) maxNum = nums[i];
}
cout << maxNum;
return 0;
}
'Algorithm > Algorithms Practice' 카테고리의 다른 글
[BOJ/C++] 가로수(2485번) (0) | 2022.10.24 |
---|---|
[BOJ/C++] N-Queen(9663번) (0) | 2022.10.23 |
[BOJ/C++] 단지번호붙이기(2667번) (0) | 2022.10.19 |
[BOJ/C++] ROT13(11655번) (0) | 2022.10.18 |
[BOJ/C++] 그룹 단어 체커(1316번) (0) | 2022.10.17 |