티스토리 뷰
최대부분 증가수열
#include<bits/stdc++.h>
using namespace std;
//int dy[1001], a[1001];
int main() {
ios_base::sync_with_stdio(false);
//freopen("input.txt", "rt", stdin);
int n, j, res=-2147000000;
cin >> n;
vector<int> dy(n+1), a(n+1);
for(int i=1; i<=n; i++){
cin >> a[i];
}
dy[1]=1;
for(int i=2; i<=n; i++){
int max=0;
for(j=1; j<i; j++){
if(a[j]<a[i] && dy[j]>max) max=dy[j];
}
dy[i]=max+1;
if(dy[i]>res) res=dy[i];
}
cout<<res;
return 0;
}
가장 길게증가하는 원소들을 뽑아서 길이가 최대인 부분 증가수열을 만들어서
부분증가수열의 최대 길이를 출력하는 문제이다.
이 문제는 dp접근법을 사용해서 푸는 문제로
첫번째 항부터 시작해서 각각의 항이 마지막이 되는 경우를 고려해서 풀면된다.
입력이 아래와 같다면
5 3 7 8 6 2 9 4
5가 마지막이 되는 경우 부분 증가수열을 만든다. 그러면 5 하나만 들어가는 수열이 나오게 되므로
최대길이는 1이다.
그 다음 3이 마지막이 되는 경우의 부분증가수열을 만든다. 3이 수열의 마지막이 되는 경우 5 3은 증가수열이 아니므로 3 하나만 들어가는 수열이 나오게 된다. 따라서 최대길이는 1이다.
7이 마지막이 되는 경우의 부분증가수열은 5 7 / 3 7 이다. 따라서 최대길이는 2이다.
8이 마지막이 되는 경우의 부분증가수열은 5 7 8 / 3 7 8 이다. 최대길이는 3이다.
6이 마지막이 되는 경우의 부분증가수열은 5 6 / 3 6 이다. 최대길이는 2이다.
2가 마지막이 되는 경우의 부분증가수열은 2 이다. 최대길이는 1이다.
이런 방식으로 배열의 마지막 숫자까지 부분증가수열의 최대길이를 구한다.
여기에서 dp접근법으로 문제를 다시보면
각각의 숫자가 마지막이 되는 경우에서 최대길이를 구할 때
해당 숫자 전에 있는 숫자가 해당숫자보다 더 작고 최대길이를 가진 경우 그 길이에 1을 더하면 해당 숫자의 최대길이를 구할 수 있다.
이러한 방법으로 마지막 숫자까지 구하면서 최대길이를 출력한다.
'lecture > algorithm - c++' 카테고리의 다른 글
[c++] 가방문제(냅색 알고리즘) (0) | 2021.02.14 |
---|---|
[c++] 가장 높은탑쌓기 (0) | 2021.02.07 |
[c++] 동적계획법(DP) (0) | 2021.02.03 |
[c++] map 사용하기, iterator 사용 (0) | 2021.01.31 |
[c++] 네임스페이스(namespace), using namespace std (0) | 2021.01.31 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- stackframe
- 입출력장치
- 배열
- 동적프로그래밍
- client side rendering
- react
- 자료구조
- 알고리즘
- 최단경로
- 운영체제
- 교착상태
- Stack
- 구조체
- C
- 인접행렬
- 세마포어
- 소프트웨어
- 클래스
- Java
- BFS
- 이진탐색
- C++
- 스텍
- 병행프로세스
- 재귀함수
- server side rendering
- 인접리스트
- dfs
- 퀵정렬
- javascript
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함