눈송이의 개발생활
[BOJ]11568 - 민균이의 계략 (C++) 본문
문제
https://www.acmicpc.net/problem/11568
코드
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
int dp[1001];
int arr[1001];
int main(){
cin.tie(0); cout.tie(0);
ios_base::sync_with_stdio(false);
int n;
cin >> n;
for(int i=0; i<n; i++){
cin >> arr[i];
dp[i]=1;
}
//LIS 사용
int result = 1;
for(int i=0; i<n; i++){
for(int j=0; j<i; j++){
if(arr[i]>arr[j]){
dp[i] = max(dp[i], dp[j] + 1);
}
}
result = max(result, dp[i]);
}
cout << result;
}
풀이
이 문제는 LIS(Longest Incresing Subsequence)를 적용하면 금방 풀 수 있다.
LIS는 수열에서 가장 긴 오름차순의 부분수열의 개수를 찾아내는 알고리즘이다.
dp[]에 가장 긴 오름차순의 부분수열 크기를 저장하고 array에서 현재 보고 있는 값보다 그 뒤의 값이 더 크다면 dp의 값을 1 증가시켜준다.
'Algorithm > BOJ' 카테고리의 다른 글
[BOJ]13305 - 주유소 (C++) (0) | 2022.01.05 |
---|---|
[BOJ]11047 - 동전 0 (C++) (0) | 2022.01.05 |
[BOJ]11048 - 이동하기 (C++) (0) | 2022.01.05 |
[BOJ]11762 - 2×n 타일링 (C++) (0) | 2022.01.05 |
[BOJ]9095 - 1,2,3 더하기 (C++) (0) | 2022.01.05 |
Comments