백준 11053
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오
수열의 길이와 수열의 값을 입력받아 가장 긴 증가하는 부분수열을 구하는 문제이다.
이 문제 역시 DP 문제 이므로, d[i]를 구하는 것이 중요한데,
- d[1] = 1
- d[i]와 d[i-1] ~ d[1]의 관계 ← 이 부분에서 주의해서 살펴보았다.
'가장 긴 증가하는 부분수열' 이 되기 위해서는
앞에 있는 수 중 i번째 숫자보다 작으며, d의 값이 가장 큰 것을 찾아야 한다.
그 이후에는, 그 값(d[j])에 1을 더하면, 우리가 구해야 하는 d[i]값이 나온다.
해당 내용에 맞추어 코드를 짜면 아래와 같다.
#include <cstdio>
using namespace std;
int nums[1001];
int d[1001];
int main(void)
{
d[0] = 1;
int num;
int biggest = 0;
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
scanf("%d", &nums[i]);
}
for (int i = 0; i < num; i++)
{
d[i] = 1;
for (int j = 0; j < i; j++)
{
if (nums[j] < nums[i] && d[i] < d[j] + 1)
{
d[i] = d[j] + 1;
}
}
if (biggest < d[i])
biggest = d[i];
}
printf("%d", biggest);
}
'백준 문제풀이' 카테고리의 다른 글
연속합 _백준 1912 (0) | 2020.07.24 |
---|---|
가장 긴 증가하는 부분 수열 4_ 백준 14002 (0) | 2020.07.23 |
이친수_2193 (0) | 2020.05.29 |
쉬운 계단 수 _ 백준 10844 (0) | 2020.05.29 |
1, 2, 3 더하기 5_ 백준15990 (0) | 2020.05.26 |