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
- 알고리즘
- 버블정렬
- 힙정렬
- 자바
- 선택정렬
- Median of Medians
- C++
- 정렬
- SNS
- 자료구조
- 동적프로그래밍
- 동적계획법
- 정수론
- DP
- 기수정렬
- 수학
- 선택알고리즘
- 재귀
- 삽입정렬
- 퀵정렬
- 코딩테스트
- java
- 백트래킹
- 병합정렬
- 프로그래밍
- 안드로이드
- 다이나믹프로그래밍
- 프로그래밍언어
- 계수정렬
- 백준
Archives
- Today
- Total
MODE::CREATIVE
[백준][c++] 12738번: 가장 긴 증가하는 부분 수열 3 본문
문제 해석
주어진 수열 안에서 가장 긴 증가하는 부분 수열의 길이를 구하는 문제 입니다.
풀이
- 먼저, 숫자의 개수 N을 입력받습니다.
- N개의 숫자를 입력받아 numbers 벡터에 저장합니다.
- lis라는 벡터를 생성하고 첫번째 숫자를 추가합니다. 이 벡터는 가장 긴 증가하는 부분 수열을 저장하는 데 사용됩니다.
- numbers 벡터의 두 번째 원소부터 마지막 원소까지 순회하며, 현재 숫자가 lis의 마지막 원소보다 크면 lis에 추가합니다. 이는 현재 숫자가 lis에 포함될 수 있음을 의미합니다.
- 만약 현재 숫자가 lis의 마지막 원소보다 작다면, 현재 숫자가 들어갈 수 있는 lis 내의 위치를 이진 탐색으로 찾아서 그 위치의 값을 현재 숫자로 업데이트합니다. 이는 lis를 최대한 작은 값으로 유지하면서 길이를 늘리는 방법입니다.
- lis의 길이를 출력합니다. 이 길이가 주어진 수열에서 가장 긴 증가하는 부분 수열의 길이가 됩니다.
코드
#include <iostream>
#include <vector>
using namespace std;
int bs(vector<int>& list, int num){
int left=0, right=list.size(), mid;
while (left < right){
mid = (left+right)/2;
if(list[mid]<num)
left = mid+1;
else{
right = mid;
}
}
return right;
}
int main() {
int n;
cin>> n;
vector<int> nums(n);
for(int i=0;i<n;i++){
cin>> nums[i];
}
vector<int> list;
list.push_back(nums[0]);
for(int i=1;i<n;i++){
if(list.back() < nums[i]){
list.push_back(nums[i]);
}
else{
int idx = bs(list, nums[i]);
list[idx] = nums[i];
}
}
cout<<list.size();
return 0;
}
'BOJ' 카테고리의 다른 글
[백준][c++] 15652번: N과 M (4) (0) | 2024.09.08 |
---|---|
[백준][JAVA] 1305번: 광고 (0) | 2024.06.17 |
[백준][c++] 2206번: 벽 부수고 이동하기 (0) | 2024.02.19 |
[백준][c++] 1918번: 후위표기식 (0) | 2024.01.08 |
[백준][c++] 11003번: 최솟값 찾기 (1) | 2024.01.05 |