-
백준 1912번: 연속합다이나믹프로그래밍(DP) 2018. 7. 3. 10:07반응형
https://www.acmicpc.net/problem/1912
1. 문제
n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 숫자를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 숫자는 한 개 이상 선택해야 한다.
예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.
2. 알고리즘
키워드 - 다이나믹프로그래밍, 브루트 포스
* 접근
초기 문제를 풀때 부르트포스로 해결 했었는데. 7달 뒤 보니 채점 기준이 달라져서 시간 초과 되었다.
입력 받는 수열 에서
이전 값과의 합이 더크 다면 현재 dp 에 dp[i - 1] + dp[i] 저장
이전 값과의 합이 작다면 현재 입력된 값 저장 : dp[i]
현재 dp[i] 의 값이 max 보다 크다면 max 값을 갱신
3. 코드
1234567891011121314151617181920212223242526272829#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <functional> // greater 사용 위해 필요#include <string>using namespace std;int dp[100001] = { 0, };int main() {ios::sync_with_stdio(false); cin.tie(0); // scanf 안쓸 경우 쓰세요. Cin 사용시int N; cin >> N;int max = -1000000008;for (int i = 1; i<= N; i++) {cin >> dp[i];// 입력을 받으면서 이전 값과의 합이 더크 다면 현재 dp 에 : dp[i - 1] + dp[i] 저장// 이전 값과의 합이 작다면 현재 입력된 값 저장 : dp[i]dp[i] = dp[i - 1] + dp[i] > dp[i] ? dp[i - 1] + dp[i] : dp[i];max = dp[i]>max ? dp[i] : max;}cout << max;return 0;}cs 반응형'다이나믹프로그래밍(DP)' 카테고리의 다른 글
백준 1309번: 동물원 (0) 2018.08.04 백준 11055 번: 가장 큰 증가 부분 수열 (0) 2018.08.02 백준 10986번: 나머지 합 (0) 2018.07.01 백준 1904번: 01타일 (0) 2018.06.24 백준 11726번: 2xn 타일링 (0) 2018.06.23