3월 20일(월) - 동적계획법 1 (11053번)
11053번: 가장 긴 증가하는 부분 수열
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이
www.acmicpc.net
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
최초 생각 정리
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
문제점
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이 - 1
(참고 -> https://rebro.kr/33)
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
int main(void)
{
int arr[1001] = { 0, };
int dp[1001];
int N;
scanf("%d", &N);
for (int i = 1; i < N + 1; i++)
{
scanf("%d", &arr[i]);
}
dp[1] = 1;
for (int i = 2; i < N + 1; i++)
{
int max = 0;
for (int j = 1; j < i; j++)
{
if (arr[j] < arr[i])
{
if (dp[j] > max)
{
max = dp[j];
}
}
}
dp[i] = max + 1;
}
int max_length = 0;
for (int i = 1; i < N + 1; i++)
{
if (max_length < dp[i])
{
max_length = dp[i];
}
}
printf("%d", max_length);
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이 - 2
(개선풀이 -> 230821 추가 )
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
// 11053번 개선 풀이
int arr[1001];
int dp[1001];
#include <stdio.h>
int MAX(int x, int y)
{
return ((x > y) ? (x) : (y));
}
int main(void)
{
int N;
scanf("%d", &N);
for (int i = 1; i <= N; i++)
{
scanf("%d", &arr[i]);
}
dp[1] = 1;
for (int i = 2; i <= N; i++)
{
dp[i] = 1;
for (int j = 1; j < i; j++)
{
if (arr[i] > arr[j])
{
dp[i] = MAX(dp[i], dp[j] + 1);
}
}
}
int max_len = 0;
for (int i = 1; i <= N; i++)
{
if (dp[i] > max_len)
{
max_len = dp[i];
}
}
printf("%d", max_len);
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
'백준(C언어) > 23년 3월' 카테고리의 다른 글
[C] 백준 - 11660번: 구간 합 구하기 5 (1) | 2023.03.23 |
---|---|
[C] 백준 - 11659번: 구간 합 구하기 4 (0) | 2023.03.21 |
[C] 백준 - 10844번: 쉬운 계단 수 (0) | 2023.03.17 |
[C] 백준 - 2156번: 포도주 시식 (0) | 2023.03.16 |
[C] 백준 - 1463번: 1로 만들기 (1) | 2023.03.15 |
댓글