728x90
시간 제한 1초, 메모리 제한 256MB
# 조건
- 수열 A가 주어졌을 때, 그 수열의 감소 부분 수열 중에서 합이 가장 큰 것을 구하는 프로그램을 작성하시오.
- 예를 들어, 수열 A = {1, 100, 2, 50, 60, 8, 7, 3, 6, 5} 인 경우에 합이 가장 큰 감소 부분 수열은 A = {1, 100, 2, 50, 60, 8, 7, 3, 6, 5} 이고, 합은 186이다.
입력
- 첫째 줄에 수열 A의 크기 N(1 ≤ N ≤ 1000)이 주어진다.
- 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다.(1 ≤ Ai ≤ 1,000)
출력
- 첫째 줄에 수열 A의 합이 가장 큰 감소 부분 수열의 합을 출력한다.
# 접근 방법
- dp를 이용하여 풀어주면 된다.
- dp의 초기값은 입력받은 nums 배열을 깊은 복사해준다.
- 2중 반복문을 돌리며 결과를 누적시켜 dp값을 갱신시켜주면 된다.
- 처음꺼는 N까지
- 2번째는 i까지 돌려주며
- nums[j] 가 nums[i]보다 크다면 dp[i] = max(dp[i], dp[j] + nums[i]) 로 갱신해준다.
import sys
sys.stdin = open('input.txt')
si = sys.stdin.readline
N = int(si())
nums = [*map(int, si().split())]
dp = [i for i in nums]
for i in range(N):
for j in range(i):
if nums[j] > nums[i]:
dp[i] = max(dp[i], dp[j] + nums[i])
print(max(dp))
728x90
'ALGORITHM > DP(동적 계획법)' 카테고리의 다른 글
[백준 21317번] 파이썬 - 징검다리 건너기 (0) | 2023.09.05 |
---|---|
[백준 16195번] 파이썬 - 1,2,3 만들기 9 (0) | 2023.09.02 |
[백준 17831번] 파이썬 - 대기업 승범이네 (0) | 2023.08.20 |
[백준 13910번] 파이썬 - 개업 (0) | 2023.08.19 |
[백준 12026번] 파이썬 - BOJ 거리 (0) | 2023.08.17 |