https://www.acmicpc.net/problem/13398
지난번 연속합과 달리 연속되는 수열 중 하나를 빼도 되는 조건이 붙었다.
연속합의 최대값을 구하는 방법은 dp를 이용하면 되는데
dp[100001], a[100001]을 int형으로 선언해주고, dp[i]는 i번째 수열로 끝나는 연속합의 최대값이다.
dp[0] = a[0];
for (int i = 1;i < n;i++) {
dp[i] = max(dp[i - 1] + a[i], a[i]);
}
코드로는 이렇다. 하지만 여기서 하나를 뺄 수 있다면 더 커질 수 있는 수열이 어떤것인지 찾아야한다.
하나를 빼는 경우와 안빼는 경우의 dp배열을 두가지 선언해 주고 그 중 더 큰값을 저장해주는 방법을 사용했다.
#include <iostream>
#include <algorithm>
#define MAX 100001
using namespace std;
int dp[MAX][2] = { 0, };
int a[MAX] = { 0, };
int main(int argc, char* argv[])
{
int n;
cin >> n;
for (int i = 0;i < n;i++) {
cin >> a[i];
}
int ans = a[0];
dp[0][0] = a[0];
dp[0][1] = a[0];
for (int i = 1;i < n;i++) {
dp[i][0] = max(dp[i - 1][0] + a[i], a[i]);
dp[i][1] = max(dp[i - 1][0], dp[i - 1][1] + a[i]);
ans = max(ans, max(dp[i][0], dp[i][1]));
}
cout << ans << '\n';
return 0;
}
다시 풀어봐야하는 문제
'코딩테스트 > C++' 카테고리의 다른 글
| [백준 C++] 2309번: 일곱 난쟁이 (0) | 2024.05.14 |
|---|---|
| [백준 C++] 2133번: 타일 채우기 (0) | 2024.05.14 |
| [백준 C++] 11054번: 가장 긴 바이토닉 부분 수열 (0) | 2024.05.13 |
| [백준 C++] 11722번: 가장 긴 감소하는 부분 수열 (0) | 2024.05.13 |
| [백준 C++] 11055번: 가장 큰 증가하는 부분 수열 (0) | 2024.05.13 |