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
- 주린이
- C++
- MySQL
- 2370 c++
- 백준 알고리즘
- 15651c++
- 백준알고리즘
- 위상정렬
- backtracking
- 브루트포스
- 백준 15651
- 백트레킹
- 주식 용어 정리
- 삼성SW 역량 테스트 기출문제
- 백준 1697
- 백준 2370
- 삼성 SW 역량 테스트 기출 문제
- 15651
- 프로그래머스
- 에라토스테네스의 체
- fill함수
- 주식 용어
- 용어 정리
- 삼성 SW역량 테스트
- 시장 선거 포스터 c++
- DP
- Programmers
- 백준
- BFS
- DFS
Archives
- Today
- Total
빠켱이
백준 11053번 가장 긴 증가하는 부분 수열[C++] 본문
11053은 dp문제입니다.
저도 처음에는 잘못 생각해서 틀렸는데,
반례로
5
10 50 20 30 40
오답 : 2
정답 : 4
잘못 생각한 이유는 이전 값보다 큰 값을 가지고 가는 형식으로 10 50을 가지고 최종 답 2를 구했습니다.
하지만 문제는 10 20 30 40 으로 최종 답 4를 구해야 합니다.
따라서 구하는 방식은
10
10 50
10 20(50을 덮어씀)
10 20 30
10 20 30 40
혹시 잘 이해가 안되시는 분들이 있을 수도 있으니
10 60 70 20 30 40 50
를 예로 들면
10
10 60
10 60 70
10 20(여기에 덮어씀, 10보다는 크기 때문) 70
10 20 30(70자리에 덮어씀, 20보다는 커서)
10 20 30 40
10 20 30 40 50 이런식으로 구해주면 문제를 풀 수 있습니다.
#include <iostream>
#include <algorithm>
using namespace std;
int n;
int dp[1000] = {};
int arr[1000] = {};
int sum = 0;
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &arr[i]);
for(int i = 0; i < n; i++){
dp[i] = 1;
for (int j = 0; j < i; j++)
if (arr[i] > arr[j])
dp[i] = max(dp[i], dp[j] + 1);
sum = max(sum, dp[i]);
}
printf("%d", sum);
}
'알고리즘 > 백준 알고리즘' 카테고리의 다른 글
백준 2565번 전깃줄[C++] (0) | 2021.01.01 |
---|---|
백준 1912번 연속합[C++] (0) | 2021.01.01 |
백준 14889번 스타트와 링크[C++] - 삼성SW 역량 테스트 기출문제 (0) | 2020.12.29 |
백준 15652 N과 M(4)[C++] (0) | 2020.12.29 |
백준 15651번 N과 M(3)[C++] (0) | 2020.12.29 |
Comments