300x250
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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
- 딥러닝
- 동적프로그래밍
- 순열
- 코딩
- dp
- 그래프
- google coding competition
- DFS
- CSS
- 리눅스
- 백준
- 운영체제
- AI
- 알고리즘
- kick start
- 코딩 테스트
- OS
- 프로그래밍
- nlp
- 네트워크
- 킥스타트
- PYTHON
- 코딩테스트
- 동적 프로그래밍
- 프로그래머스
- linux
- 파이썬
- 브루트포스
- BFS
- 구글 킥스타트
Archives
- Today
- Total
오뚝이개발자
[백준11055] 가장 큰 증가하는 부분수열 본문
728x90
300x250
문제
https://www.acmicpc.net/problem/11055
생각의 흐름
각 자리에 있는 수를 선택하였을 때 올 수 있는 가장 큰 합을 dp 리스트에 저장한다. 예를 들어, 문제에서 예시로 주어진 arr = [1, 100, 2, 50, 60, 3, 5, 6, 7, 8]의 경우 dp = [1, 101, 3, 53, 113, 6, 11, 17, 24, 32]가 된다. 이 중 max를 출력하면 정답이다.
각 자리에 올 수 있는 수 중 어떤 수가 max인지를 알기 위해선 이중 for문을 사용하여야 한다. 예를 들어 50의 경우 2~0까지의 인덱스들과 비교하여 해당 수가 50보다 작다면 리스트 s에 값을 넣어준다. 2는 50보다 작으니 s = [53]이 되고 다시 100은 50보다 크니 넘어간다. 1은 50보다 작으니 s = [53, 51]이 되고 max(s)는 53이므로 dp[3]=53이 된다.
코드
# 백준 11055
import sys
N = int(input())
arr = list(map(int, input().split()))
dp = [0]*N
if N == 1:
print(arr[0])
sys.exit()
dp[0]=arr[0]
for i in range(1,N):
s = []
for j in range(i-1,-1,-1):
if arr[j]<arr[i]:
s.append(arr[i]+dp[j])
if s:
dp[i]=max(s)
else:
dp[i]=arr[i]
print(max(dp))
728x90
300x250
'코딩 테스트 > 백준' 카테고리의 다른 글
[백준2225] 합분해 (0) | 2020.04.28 |
---|---|
[백준14002] 가장 긴 증가하는 부분수열 4 (0) | 2020.04.28 |
[백준11057] 오르막수 (0) | 2020.04.26 |
[백준9465] 스티커 (2) | 2020.04.23 |
[백준11727] 2 x n 타일링 2 (0) | 2020.04.21 |
Comments