개근상
https://www.acmicpc.net/problem/1563
풀이
- 어렵다
- D[i][j][k]
1 | i일, 지각 j번, 연속 결석 k번 |
오늘 출석
- 전날에 출석, 지각, 결석 중에 하나
- D[i][j][0] += D[i-1][j][k] (0 ≤ k ≤ 2)
오늘 지각
- j 가 1
- D[i][1][0] += d[i-1][0][k]
오늘 결석
- k < 2
- D[i][j][k+1] += D[i-1][j][k]
https://www.acmicpc.net/problem/1563
1 | i일, 지각 j번, 연속 결석 k번 |
오늘 출석
오늘 지각
오늘 결석
https://www.acmicpc.net/problem/11066
dp[i][j]
수열에서 i번째~j번째 수까지 합치는데 필요한 최소 비용
min(dp[i][k] + dp[k+1][j]) + (i~j 수열의 합) (i <= k < j) 일 때
i _ _ _ k k+1 _ _ _ j
https://www.acmicpc.net/problem/1789
런타임 에러가 계속 났음
원인
해결
쉬운 문제라도, 문제의 조건을 잘 확인해야함
https://www.acmicpc.net/problem/3986
https://www.acmicpc.net/problem/2839
d[i]
ikg을 담을 수 있는 최소 봉지 수
ex) 6kg
0 + 6 => 6을 3kg짜리 봉지 2개로 담을 수 있음 => d[6] = 2
1 + 5 => d[1]== -1 => X
2 + 4 => d[2]== -1 => X
3 + 3 => d[6] = d[3] + d[3] = 1
ex) 10kg
0 + 10 => 10을 5kg짜리 봉지 2개로 담을 수 있음 => d[10] = 2
1 + 9 => d[1]== -1 => X
2 + 8 => d[2]== -1 => X
3 + 7 => d[7]== -1 => X
4 + 6 => d[4]== -1 => X
5 + 5 => d[5] == 1 => d[10] = d[5] + d[5] = 2
위와 같이, 앞 단계에서 사용된 값이 재사용된다. 따라서 DP
더 간결하게 어떻게 짤 수 있을까?
https://www.acmicpc.net/problem/1509
result[i-1] +1
https://www.acmicpc.net/problem/9084
ex) 1원, 5원, 10원이 있다. 만들어야하는 동전은 100원
1원을 이용해서
d[1] : 1원을 만드는 경우의 수 => 1원, d[0] => 1
d[2] : 2원을 만드는 경우의 수 => 1원, d[1] => 1
d[3] : 3원을 만드는 경우의 수 => 1원, d[2] => 1
…
d[100] : 100원을 만드는 경우의 수 => 1원, d[99] => 1
5원을 이용해서
d[5] : 5원을 만드는 경우의 수 => (1원, d[4]) + (5원, d[0]) => 1 + 1 => 2
d[6] : 6원을 만드는 경우의 수 => 1원, d[5] => 1
d[7] : 7원을 만드는 경우의 수 => 5원, d[2] => 1
…
d[9] : 9원을 만드는 경우의 수 => (1원,d[8]) + (5원, d[5])
…
d[100]
10원을 이용해서
d[10] : 10원을 만드는 경우의 수 => (1원,d[9]) + (5원, d[5]) + (10원, d[0])
…
d[100]
위와 같이 전 단계에 나온 결과값을 재사용할 수 있다. 때문에 DP 문제이다.
https://www.acmicpc.net/problem/6359