zooyeonii 2022. 2. 13. 17:11

1. BOJ 1912 연속합 

(Lv. 실버2) 다이나믹 프로그래밍

https://www.acmicpc.net/problem/1912

코드

1
2
3
4
5
6
7
8
= int(input())
arr = list(map(int, input().split()))
for i in range(1,n):
    if arr[i-1]<0:
        arr[i]=arr[i]
    else:
        arr[i]+=arr[i-1]
print(max(arr))
cs

설명

arr  [ 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 ]

arr  [10, -4, 3, 4, 9, 15,-35, 12 , 33, -1 ]

1. 양수를 최대한 많이 더한다. 음수가 나오면 종료한다. 

2. arr[i-1] 가 음수이면, arr[i]는 그대로이고, arr[i-1]가 양수이면 arr[i]와 더한 값을 arr[i]로 업데이트한다. 

 

2. BOJ 2293 동전 1

(Lv. 골드5) 다이나믹 프로그래밍

https://www.acmicpc.net/problem/2293

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
n, k = map(int, input().split())
C, rm = [], []
dp = [0 for _ in range(k+1)]
for i in range(n):
    rm.append(int(input()))
rm = set(rm)
rm = list(rm)
for i in rm:
    if i<=k:
        C.append(i)
 
for c in C:
    dp[c] += 1
    for j in range(c, k+1):
        dp[j] += dp[j-c]
print(dp[-1])
cs

설명 

n종류의 동전의 합이 k가 되는 경우의 수를 구해야 한다. 

rm은 중복되거나 k보다 큰 동전을 제거하기 위해 사용한다. C에 최종적으로 동전이 담긴다. 

dp는 0부터 k 까지 경우의 수를 의미한다. 합이 dp[i]가 되는 경우의 수를 기록할 것이다.

실질적으로 dp에서 구현한 것은 12-15까지이다. 

1. C 동전의 종류 별로 for문을 돌 것이다. 

2. 우선 dp[c] 는 동전 c 하나로 이루어지므로 dp[c] 에 1을 더한다. 

3. c부터 k까지 for문을 돌면서, dp[j] += dp[j-c]를 해준다. 

dp[j-c]는 j-c 값의 경우의 수이고, 이 값에 c를 더하면 j 이다. 그러므로 dp[j] 는 (j-c)의 경우의 수를 더하여 업데이트된다.