Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
Tags
- 양과 늑대
- Java
- 자바
- 뷰바인딩
- mutablestate
- rememberupdatedstate
- 명령형 ui
- BottomSheet
- bottomscaffold
- compose
- 선언형 ui
- JCF
- 선언형ui
- 클린아키텍처
- apollo3
- genarics
- 안드로이드
- viewbinding
- 2022 KAKAO BLIND RECRUITMENT
- ModalBottomSheet
- remembercoroutinescope
- derivedstateof
- mutableStateOf
- clean coder
- 2989번
- snapshotflow
- 2022 kakao blind
- 명령형ui
- State
- producestate
Archives
- Today
- Total
버미
백준 11053번 - 가장 긴 증가하는 부분 수열(C언어) 본문
문제
수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.
예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.
입력
첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.
둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)
출력
첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.
예제 입력 1
6
10 20 10 30 20 50
예제 출력 1
문제 풀이
#include <stdio.h>
int max_fn(int a, int b){
if(a>b)
return a;
else
return b;
}
int main(void){
int N, max = 0;
scanf("%d", &N);
int A[N];
for(int i=0; i<N; i++){
scanf("%d", &A[i]);
}
int LIS[N]; //A[i]를 포함하는 가장 긴 부분 수열의 길이
for(int i = 0; i < N; i++)
LIS[i]=1;
for(int i=1; i<N; i++)
{
for(int j=0; j<i; j++)
if(A[i]>A[j])
LIS[i] = max_fn(LIS[i], LIS[j]+1);
}
for(int i=0; i<N; i++)
if(LIS[i]>max)
max=LIS[i];
printf("%d\n", max);
return 0;
}
동적 계획법으로 접근해 문제를 풀었다.
'코딩 트레이닝' 카테고리의 다른 글
백준 9095번 - 1, 2, 3 더하기(C++) (0) | 2023.07.18 |
---|---|
백준 1463번 - 1로 만들기(C언어) (0) | 2023.07.17 |
백준 9093번 - 단어 뒤집기(C++) (0) | 2023.07.14 |
백준 2225번 - 합분해(C언어) (0) | 2023.07.13 |
백준 1676번 - 팩토리얼 0의 개수(C언어) (0) | 2023.07.12 |