September 28, 2021
N명의 병사가 무작위로 나열되어 있습니다. 각 병사는 특정한 값의 전투력을 보유하고 있습니다.
병사를 배치할 때는 전투력이 높은 병사가 앞쪽에 오도록 내림차순으로 배치를 하고자 합니다. 다시 말해 앞쪽에 있는 병사의 전투력이 항상 뒤쪽에 있는 병사보다 높아야 합니다.
또한 배치 과정에서는 특정한 위치에 있는 병사를 열외시키는 방법을 이용합니다. 그러면서도 남아 있는 병사의 수가 최대가 되도록 하고 싶습니다.
병사에 대한 정보가 주어졌을 때, 남아 있는 병사의 수가 최대가 되도록 하기 위해서 열외시켜야 하는 병사의 수를 출력하는 프로그램을 작성하세요.
256MB
1초
첫째 줄에 N이 주어집니다. (1≤N≤2,000)
둘째 줄에 각 병사의 전투력이 공백으로 구분되어 차례대로 주어집니다. 각 병사의 전투력은 10,000,000보다 작거나 같은 자연수입니다.
첫째 줄에 남아 있는 병사의 수가 최대가 되도록 하기 위해서 열외시켜야 하는 병사의 수를 출력합니다.
#include <stdio.h>
using namespace std;
int N, maxVal;
int soldier[2000], dp[2000];
void putSoldier() {
for (int i = 0; i < N; ++i) {
dp[i] = 1;
for (int j = 0; j < i; ++j) {
if (soldier[j] > soldier[i]) {
dp[i] = dp[i] > dp[j] + 1 ? dp[i] : (dp[j] + 1);
if (dp[i] > maxVal) maxVal = dp[i];
}
}
}
}
int main() {
scanf("%d", &N);
for (int i = 0; i < N; ++i) {
scanf("%d", &soldier[i]);
}
putSoldier();
printf("%d", maxVal);
return 0;
}
이 문제의 기본 아이디어는 Longest Increasing Subsequence(LIS)로 알려진 전형적인 다이나믹 프로그래밍 문제의 아이디어와 같다.