-
[백준/BOJ] 18353번 병사 배치하기 (C++)알고리즘 문제풀이/백준 2020. 12. 21. 17:02
18353번: 병사 배치하기
첫째 줄에 N이 주어진다. (1 ≤ N ≤ 2,000) 둘째 줄에 각 병사의 전투력이 공백을 기준으로 구분되어 차례대로 주어진다. 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수이다.
www.acmicpc.net
DP 유형의 문제로 LIS를 활용하는 문제입니다.
전투력이 높은 병사가 앞쪽에 오도록 내림차순으로 배치를 하고자 하므로, 이를 뒤집어 오름차순으로 변경하고 LIS의 최대값을 구해 전체 병사의 수에서 빼주면 되는 문제입니다.
#include <iostream> #include <vector> #include <algorithm> using namespace std; int dp[2001]; int main(void) { ios_base::sync_with_stdio(false); cin.tie(0); int n, answer = 0; cin>>n; vector<int> v(n + 1); for(int i = 1; i <= n; i++) { cin>>v[i]; } // 배열을 오름차순 비슷하게 만들기 위해 뒤집기(벡터를 1번 인덱스부터 사용하므로 +1) reverse(v.begin() + 1, v.end()); // dp 배열을 1로 초기화 fill(dp + 1, dp + 2001, 1); // LIS(Longest Increasing Subsequence) : 최장 증가 수열 for(int i = 2; i <= n; i++) { for(int j = 1; j <= i; j++) { if(v[i] > v[j]) { dp[i] = max(dp[i], dp[j] + 1); } } } for(int i = 1; i <= n; i++) { answer = max(answer, dp[i]); } cout<<n - answer; }
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[백준/BOJ] 4539번 반올림 (C++) (0) 2020.12.22 [백준/BOJ] 2293번 동전 1 (C++) (0) 2020.12.21 [백준/BOJ] 11053번 가장 긴 증가하는 부분 수열 (C++) (0) 2020.12.21 [백준/BOJ] 1912번 연속합 (C++) (0) 2020.12.20 [백준/BOJ] 1149번 RGB거리 (C++) (0) 2020.12.20