https://www.acmicpc.net/problem/11055
가장 싫은 큰 증가하는 부분 수열이다. dp로 해결하면 되는 문제
dp[1001] 선언해주고 수열을 받아올 a[1001]도 선언해준다.
이 문제를 푸는 핵심은 i로 끝나는 가장 큰 증가하는 부분 수열을 dp[i]에 저장해 주는 것이다.
즉, dp[0]은 a[0]이고 dp[1]은 a[0]와 a[1]을 비교하여 증가한다면 dp[1]에 dp[0] + a[1]를 넣어준다. 마찬가지로 dp[2]은 a[1]와 a[2]을 비교한 뒤 증가하였다면 dp[2]에 dp[1] + a[2]를 넣어준다. 또한 a[2]와 a[0]를 비교한 뒤 증가하였다면 dp[0] + a[2]를 해주고 이전값과 비교하여 최대값을 dp[2]에 저장해준다.
#include <iostream>
#include <algorithm>
#define MAX 1001
using namespace std;
int dp[MAX] = { 0, };
int a[MAX] = { 0, };
int main(int argc, char* argv[])
{
int n, max1 = 0;
cin >> n;
for (int i = 0;i < n;i++) {
cin >> a[i];
}
for (int i = 0; i < n;i++) {
dp[i] = a[i];
for (int j = i - 1;j >= 0;j--) {
if (a[i] > a[j]) {
dp[i] = max(dp[i],(dp[j] + a[i]));
}
}
max1 = max(max1, dp[i]);
}
cout << max1;
return 0;
}
설명을 잘하는것도 중요하다는 생각이 든다. 하지만 아직까지는 설명량과 학습량은 반비례한다고 생각해서 학습을 더 많이 하고자 한다.
'코딩테스트 > C++' 카테고리의 다른 글
| [백준 C++] 11054번: 가장 긴 바이토닉 부분 수열 (0) | 2024.05.13 |
|---|---|
| [백준 C++] 11722번: 가장 긴 감소하는 부분 수열 (0) | 2024.05.13 |
| [백준 C++] 1932번: 정수 삼각형 (0) | 2024.05.13 |
| [백준 C++] 2156번: 포도주 시식 (0) | 2024.05.12 |
| [백준 C++] 9465번: 스티커 (0) | 2024.05.12 |