동적계획법을 이용한, 최대 부분 증가수열(LIS : Longest Increasing Subsequence) in C++
6426 단어 LIS최대 부분 증가수열LIS
배열의 크기 n이 주어지고, 크기만큼의 배열이 주어질때 최대로 증가하는 부분의 크기를 구하는 코드
#include <iostream>
#include <vector>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
freopen("input.txt", "rt", stdin);
int n, res=0;
cin>>n;
vector<int> arr(n+1), dp(n+1);
for(int i=1; i<=n; i++){
cin>>arr[i];
}
dp[1]=1;
for(int i=2; i<=n; i++){
int max_temp=0;
for(int j=i-1; j>=1; j--){
if(arr[j]<arr[i]) {
max_temp = max(dp[j], max_temp);
}
}
dp[i]=max_temp+1;
res = max(dp[i], res);
}
cout<<res;
return 0;
}
- dp[i] : i번째 원소를, 증가수열 부분의 마지막이라고 할때의, 최대 부분 증가수열의 크기
- i번째의 원소보다 작은 j의 범위에서, i번째 원소보다 작은 j번째 원소 중에, 가장 큰 부분 증가수열 크기에 +1을 한다.
- if(arr[j] < arr[i]) : i번째 원소보다 작은 j번쨰 원소 중에
- max_temp = max(dp[j], max_temp) : 가장 큰 부분 증가수열 크기에
- dp[i] = max_temp+1 : +1을 한다.
ex)
8
5 3 7 8 6 2 9 4
Author And Source
이 문제에 관하여(동적계획법을 이용한, 최대 부분 증가수열(LIS : Longest Increasing Subsequence) in C++), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@juwon9733/동적계획법을-이용한-최대-부분-증가수열LIS-Longest-Increasing-Subsequence-in-C저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)