오답노트
[DP] BOJ 1912 연속합 - 오답노트 본문
https://www.acmicpc.net/problem/1912
- 문제 파악
주어진 수열에서 1개 이상의 연속되는 수를 선택하여 선택한 수들의 합의 최댓값을 출력하라.
- 나의 접근
i 번째 부터 n번째 모두 더하는데 그중에 가장 큰 값을 D 배열에 넣어놨다.
일단 위와 같은 경우는 시간 초과에 당연히 걸리며, 점화식을 전혀 활용하지 못했다.
for문을 한번만 사용해야한다는 것 까지는 깨달았지만, D를 어떤 식으로 사용해야할지 더 이상 생각나지 않았다.
- 정답
DP 문제는 의외로 간단하게 문제 풀리는데, 그게 더 맥빠진다.
D 배열은 수열의 값을 더한 결과를 입력하는데, 대신 D배열 + 현재값이 현재값보다 작으면 현재값부터 다시 시작한다.
#include "bits/stdc++.h"
using namespace std;
int n;
int D[100001];
int arr[100001];
int ans = -10000;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(0);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> arr[i];
for (int i = 1; i <= n; i++)
{
if (D[i-1] + arr[i] < arr[i])
{
D[i] = arr[i];
}
else
{
D[i] = D[i - 1] + arr[i];
}
ans = max(ans, D[i]);
}
cout << ans;
}
'C,C++ > 코딩테스트' 카테고리의 다른 글
[DP] BOJ 15988번 1, 2, 3 더하기 3 (0) | 2022.05.13 |
---|---|
[DP] BOJ 1699번 제곱수의 합 - 오답노트 (0) | 2022.05.13 |
[DP] BOJ 14002 가장 긴 증가하는 부분 수열 4 (0) | 2022.05.12 |
[DP] BOJ 11053 가장 긴 증가하는 부분 - 오답노트 (0) | 2022.05.11 |
[DP] BOJ 10844 쉬운 계단 수 - 오답노트 (0) | 2022.05.11 |