๐ก ์กฐ๊ฑด ๋ฐ ํ์ด
- ํด์ฌ๊ฐ ๋จ์ ์ผ ์
N
.
1 <= N <= 1500000
- T, P ์ ๊ธธ์ด๋ N๊ณผ ๊ฐ์ผ๋ฉฐ,
1 <= Ti <= 50
, 1 <= Pi <= 1000
N + 1
์ ํด๋นํ๋ ๋ ์ง๋ถํฐ๋ ์๋ด์ ํ ์ ์๋ค.
- DP ์ ํ์ ๋ฌธ์
- ์๋ด์ ํตํด ์ทจํ ์ด์ต ์ค, ๊ฐ์ฅ ํฐ ๊ฐ์ ๋ฐํํ๋ ๋ฌธ์ .
๐ฅ ์์ค ์ฝ๋
from sys import stdin
n = int(stdin.readline())
t, p = [], []
dp = [0 for _ in range(n + 1)]
for _ in range(n):
ti, pi = map(int, stdin.readline().split())
t.append(ti)
p.append(pi)
k = 0
for i in range(n):
k = max(k, dp[i])
if i + t[i] > n:
continue
dp[i + t[i]] = max(k + p[i], dp[i + t[i]])
print(max(dp))
๐ ์์ ๋ฐ ์คํ๊ฒฐ๊ณผ
์์
10
5 50
4 40
3 30
2 20
1 10
1 10
2 20
3 30
4 40
5 50
์คํ๊ฒฐ๊ณผ
90
โจ๏ธ ๋ฌธ์ ํ์ด
- ํธํ ๊ณ์ฐ์ ์ํด dp๋ฅผ
n + 1
์ ํฌ๊ธฐ๋งํผ ์์ฑํ๋ค.
- ์๋ด์ ํ๋๋ฐ ํ์ํ ์๊ฐ์ ๋ด์ ๋ฆฌ์คํธ
T
๋ฅผ ์์ฑ
- ์๋ด์ ํ๋ฉด ์ป์ ์ ์๋ ์ด์ต์ ๋ด์ ๋ฆฌ์คํธ
P
๋ฅผ ์์ฑ
- 1์ผ์งธ๋ถํฐ ์๋ด์ ์งํํ๋ฉด ์ป์ ์ ์๋ ์ด์ต์ DP ๋ฆฌ์คํธ์ ์ต๋๊ฐ์ผ๋ก ๊ฐฑ์
- ์๋ด์ ์์ํ ๋ ์ ์ด์ต์ ๋ฐ์ดํฐ๊ฐ DP ๋ฆฌ์คํธ์ ์๋ด์ด ๋๋๋ ๋ ์์น์ ๋ค์ด๊ฐ
- i๋ฒ์งธ ๋ ์ ์๋ด์ ์์ํ์ผ๋ฉด,
i + t[i]
๊ฐ n์ ๋์ง ๋ง์์ผํ๋ค.
์ฆ, 7(N)์ผ ๋จ์ ํด์ฌ ์์ ์๊ฐ ํด์ฌ ํ๋ฃจ ์ ๋ (i = 7)์
T[i]
2์ผ ๊ฑธ๋ฆด ์๋ด์ ์์ํ๋ฉด, ๋๋ด์ง ๋ชปํ๊ธฐ์(N < Ti + i) ์ด์ต์ ์ทจํ ์ ์๋ค.
- k ๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค์ด,
dp[i]
์ k ์ค ๊ฐ์ฅ ํฐ ๊ฐ์ ์ง์ด๋ฃ๋๋ค.
์ด ๊ฐ๊ณผ dp[i + t[i]]
์ด ๊ฐ์ ๋น๊ตํ์ฌ ํฐ ๊ฐ์ dp[i + t[i]]
์ ๋ฃ๋๋ค.
๐พ ๋๋์
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ฌธ์ ์ ๋งค์ฐ ์ฝํ๋ค. ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ๊พธ์คํ ํ์ด๋ด์ผ๊ฒ ๋ค.
- ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ ๋ถ๋ถ์์๋ ๊ตฌํ ๋ถ๋ถ์์ ๊ต์ฅํ ํค๋งค๋ ๊ฒ ๊ฐ๋ค.
๊ฐ ๋ณ์์ ์ฌ์ฉ์ฒ, ๊ฐฑ์ ๋ฑ์ ๋ ๊ผผ๊ณฐํ ์ฒดํฌํด์ ์ฌ๊ณ ํ๋ ๋ฅ๋ ฅ์ ๋ ํค์์ผ๊ฒ ๋ค.