Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
| 31 |
Tags
- 애니메이션
- 백준
- directx12 그리기 연산2
- 다음소수
- 뱀과사다리게임
- 그리기 연산
- 2075번
- 2d 박스충돌
- lis응용
- 랜더링 파이프라인
- 루트서명
- dx12 정리
- 드래곤플라이트 모작
- 백준 24444 c++
- Perforce
- Unreal
- DirectX12
- 백준 1260 c++
- BFS
- 바이토닉 수열
- unrealengine
- 2565번
- dx12
- 24779
- WinAPI
- C++
- 4134번
- 11286번
- 백준 c++ 24479번
- 다익스트라
Archives
- Today
- Total
game-1 님의 블로그
[백준] C++ 11054번:가장 긴 바이토닉 부분 수열 본문



풀이)
동적 계획법의 한 문제로
증가 부분의 수열과 감소부분의 수열을 나누어 값을 구한 뒤에
두 값들의 합의 최댓값을 구하면 되는 문제입니다.
여기서 증가 부분의 수열을: ldp
감소 부분의 수열을 :rdp로 칭하였습니다.
코드는 다음과 같습니다.
코드)
#include<iostream>
#include<algorithm>
#include<vector>
#include<array>
using namespace std;
int main()
{
int n;
cin >> n;
array<int, 1001> arr;
for (int i = 0; i < n; ++i) {
cin >> arr[i];
}
vector<int> ldp(n, 1);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < i; ++j) {
if (arr[i] > arr[j])
ldp[i] = max(ldp[i], ldp[j] + 1);
}
}
vector<int> rdp(n, 1);
for (int i = n - 1; i >= 0; --i) {
for (int j = n - 1; j > i; --j) {
if (arr[i] > arr[j])
rdp[i] = max(rdp[i], rdp[j] + 1);
}
}
int cnt{};
for (int i = 0; i < n; ++i) {
cnt = max(cnt, ldp[i] + rdp[i] - 1);
}
cout << cnt;
}
결과)

개인적으로 동적계획법이 저한테는 어렵게 느껴지는 것 같습니다.
이렇게 간단한 코드임에도 이를 생각해내는 부분이 어려워 많이 연습해봐야겠습니다.
'백준 문제풀이' 카테고리의 다른 글
| [백준] C++ 2805번 나무자르기 (1) | 2025.01.14 |
|---|---|
| [백준] C++ 1697번:숨바꼭질 (1) | 2025.01.13 |
| [백준] C++ 11286번:절댓값 힙 (1) | 2025.01.09 |
| [백준] 1927번: 최소 힙 C++ (0) | 2025.01.08 |
| [백준] 7562번 C++ 나이트의 이동 (0) | 2025.01.04 |