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
- 코딩테스트실력진단
- 알고리즘
- 파이썬
- react-query
- DFS
- 코테
- 백준
- 재귀
- 블챌
- react
- 완전탐색
- DP
- 스택
- 그리디알고리즘
- 코드트리
- JS
- 문자열
- django
- CSS
- 그리디
- DFS활용
- 스택자료구조
- Express
- 구현
- 코딩테스트
- socket.io
- 자료구조
- DFS기초
- 백준알고리즘
- BFS
Archives
- Today
- Total
꾸준하게 거북이처럼
백준 11055번 파이썬 본문
11055번: 가장 큰 증가 부분 수열
수열 A가 주어졌을 때, 그 수열의 증가 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {1, 100, 2, 50, 60, 3, 5, 6, 7, 8} 인 경우에 합이 가장 큰 증가 부분 수
www.acmicpc.net
풀이
현재의 값보다 작은 수들 중 가장 dp 값이 큰 것을 더하여 dp값을 업데이트 하고 max(dp)를 구한다.
코드
n = int(input())
arr = list(map(int, input().split()))
dp = [0] * n
dp[0] = arr[0]
for i in range(1, n):
big = 0
for j in range(i):
if arr[j] < arr[i] and big < dp[j]:
big = dp[j]
dp[i] += big + arr[i]
print(max(dp))
여기서 더 시간적 효율성을 높일 수 있는 다른 풀이도 있다.
풀이2
이미 정렬이 되어있다면? 엄청 쉬울 것이다. 해당 숫자 전까지 리스트 중에서 가장 큰 값을 더하면 그만이다.
이미 값의 범위는 1000이하로 정해져 있어서 배열을 이용하여 1001까지의 배열을 만들어 각각 최댓값(해당 숫자 전까지 리스트 중에서 가장 큰 값)을 구하여 dp배열에 저장한다.
코드
n = int(input())
dp = [0] * 1001
a = list(map(int, input().split()))
for i in a:
dp[i] = max(dp[:i]) + i
print(max(dp))
'Algorithm 문제 & 공부 > DP' 카테고리의 다른 글
백준 13398번 파이썬 - 연속합2 (0) | 2022.08.26 |
---|---|
백준 11054번 파이썬 - 가장 긴 바이토닉 부분 수열 (0) | 2022.08.25 |
백준 2156번 - 파이썬 (1) | 2022.08.21 |
백준 1309 파이썬 (0) | 2022.08.18 |
백준 1149번 파이썬 (0) | 2022.08.17 |
Comments