코딩테스트/백준_골드 [C++][백준 14002] 가장 긴 증가하는 부분 수열 4 - [문제] https://www.acmicpc.net/problem/14002 14002번: 가장 긴 증가하는 부분 수열 4 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net [문제 풀이] 기존에 풀었던 가장 긴 증가하는 부분 수열에서 풀었던 방식을 이용해서 풀었다. DP를 이용해서 부분 수열의 가장 긴 길이가 몇인지를 파악한 후에 뒤에서 부터 O(n)을 이용해서 순서대로 해당 길이에 맞은게 있으면 그 길이로부터 1씩을 제거하면서 파악하였다. 입력을 해주면서 동시에 각 수의 길이값을 파악하였다.(19~28) 해당 수의 길이가 몇인지를 파악하면서 벡터에 넣어주었다.(31~36) 벡터에 넣어진 값을 뒤에서부터 순서대로 출력한다.(31~36) [코드] 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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 #include<iostream> #include<vector> #include<algorithm> #define endl "\n" using namespace std; int main(){ int n; cin>>n; vector<int> sequence(n+1); vector<int> increase; vector<int> DP(n+1); DP[0] = 1; int len = 0; for(int i = 1;i<=n;i++){ cin>>sequence[i]; DP[i] = 1; for(int j = 1;j<i;j++){ if(DP[i]<=DP[j] and sequence[j]<sequence[i]){ DP[i] = DP[j] + 1; } } len = max(len, DP[i]); } cout<<len<<endl; for(int i = n;i>0;i--){ if(DP[i] == len){ increase.push_back(sequence[i]); len--; } } int size = increase.size(); for(int i = increase.size()-1;i>=0;i--){ cout<<increase[i]<<" "; } return 0; } Colored by Color Scripter cs 공유하기 게시글 관리 Yoon-1212 '코딩테스트 > 백준_골드' 카테고리의 다른 글 [C++][백준 2448] 별 찍기 - 11 (0) 2022.09.17 [C++][백준 2447] 별 찍기 - 10 (0) 2022.09.14 [C++][백준 12738] 가장 긴 증가하는 부분 수열 3 (0) 2022.09.08 [C++][백준 12015] 가장 긴 증가하는 부분 수열 2 (0) 2022.09.07 [C++][백준 2631] 줄세우기 (0) 2022.09.07 Contents 당신이 좋아할만한 콘텐츠 [C++][백준 2448] 별 찍기 - 11 2022.09.17 [C++][백준 2447] 별 찍기 - 10 2022.09.14 [C++][백준 12738] 가장 긴 증가하는 부분 수열 3 2022.09.08 [C++][백준 12015] 가장 긴 증가하는 부분 수열 2 2022.09.07 댓글 0 + 이전 댓글 더보기