Skip to main content

DP

BOJ 31265 ํ›ˆ๋ จ

·186 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/31265 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ดํ•ด๊ฐ€ ์กฐ๊ธˆ ์–ด๋ ค์šด๋ฐ, ๊ฒฐ๊ตญ $N$๊ฐœ์˜ ํ›ˆ๋ จ ์ƒํ™ฉ์—์„œ $d$๊ฐœ์˜ ํ›ˆ๋ จ ๊ฐ€์šด๋ฐ ํ•˜๋‚˜๋ฅผ ๊ณ„์† ๊ณ ๋ฅด๊ณ , ํ›ˆ๋ จ ์‹œ๊ฐ„์˜ ํ•ฉ์„ ์ตœ๋Œ€ํ™” ํ•˜๊ณ ์‹ถ๋‹ค. ๋ฐฐ๋‚ญ ๋ฌธ์ œ์™€ ๋น„์Šทํ•ด๋ณด์ธ๋‹ค. $d$๊ฐœ์˜ ์„ ํƒ์ง€๊ฐ€ $N$๋ฒˆ ์ฃผ์–ด์ง€๊ณ , ํ›ˆ๋ จ์‹œ๊ฐ„ = ๋ฌด๊ฒŒ์˜ ํ•ฉ์„ ์ตœ๋Œ€ํ™” ํ•ด์•ผํ•œ๋‹ค. ์–ด? ๋‚˜์ด๋ธŒํ•˜๊ฒŒ ํ•˜๋ฉด ํ„ฐ์ง€๋‚˜? ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ํ•ด์•ผํ•˜๋Š” ์—ฐ์‚ฐ๋Ÿ‰์€ $M * d_i$์ด๋‹ค. ์ด ์—ฐ์‚ฐ๋Ÿ‰์€ $\sum\limits_{i = 1}^N M * d_i \leq 1000 M$ ์ด๋‹ˆ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค. ์•„๋‹ˆ!!!!!!!! ์™œํ‹€๋ ธ๋‚˜ ํ–ˆ๋„ค ๊ฐ ํ›ˆ๋ จ ์ƒํ™ฉ์—์„œ ์ ์–ด๋„ ํ•˜๋‚˜์˜ ํ›ˆ๋ จ์„ ๊ณจ๋ผ ํ›ˆ๋ จ ๊ณ„ํš์— ๋„ฃ์œผ๋ ค๊ณ  ํ•œ๋‹ค. ํ•œ ํ›ˆ๋ จ์„ ์—ฌ๋Ÿฌ๋ฒˆ ์“ฐ์ง€ ์•Š๊ฒŒ $M$์— ๋Œ€ํ•ด ์—ญ์ˆœ์œผ๋กœ ๋Œ๋ฉด์„œ, ์ž˜ ์ฒ˜๋ฆฌํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ cin >> N >> M; rep(i, 0, N){ cin >> D[i]; tv[i].resize(D[i]); } rep(i, 0, N) rep(j, 0, D[i]) cin >> tv[i][j]; knapsack[0][0] = true; rep(i, 1, N+1) for(auto t: tv[i-1]) rrep(j, 0, M+1) if(j - t >= 0 && (knapsack[i-1][j-t] || knapsack[i][j-t])) knapsack[i][j] = true; rrep(j, 0, M+1) if(knapsack[N][j]){ cout << j; return; } cout << -1; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 30788 Sakura Reflection

·335 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30788 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋Œ€์นญ์ด๋™์„ ์–ด๋–ป๊ฒŒ ์ˆ˜ํ•™์ ์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ?? ์‰ฌ์šด๊ฑฐ๋ถ€ํ„ฐ ํ•ด๋ณด์ž. ์›๋ž˜ ์ ์ด $(x, y)$์— ์žˆ์—ˆ๋‹ค๋ฉด $90\degree$ ์ง์„ ์— ๋Œ€์นญ์‹œํ‚ค๋ฉด $(-x, y)$ $45\degree$ ์ง์„ ์— ๋Œ€์นญ์‹œํ‚ค๋ฉด $(y, x)$ $60\degree$ ์ง์„ ์— ๋Œ€์นญ์‹œํ‚ค๋ฉด $y = \sqrt{3}x$์— ๋Œ€์นญ์ธ๊ฑฐ๋‹ˆ๊นŒ… ์•„๋‹ˆ ์ด๊ฑฐ ๋„ˆ๋ฌด ๊นŒ๋‹ค๋กœ์šด๋ฐ? ํ–‰๋ ฌ์—ฐ์‚ฐ์€ ํ•˜๊ธฐ ์‹ซ์€๋ฐ.. ๊ฐ๋„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด๋Š”๊ฒƒ๋„ ์ข‹๊ฒ ๋‹ค. ๊ทน์ขŒํ‘œ๊ณ„์ฒ˜๋Ÿผ, ์›๋ž˜ ์ ์ด $0\degree$์— ์žˆ์—ˆ๋‹ค๋ฉด $60\degree$์— ๋Œ€ํ•ด ๋Œ€์นญ์‹œํ‚ค๋ฉด $120\degree$์— $120\degree$์— ๋Œ€ํ•ด ๋Œ€์นญ์‹œํ‚ค๋ฉด $240\degree$์— ์ด๋Ÿฐ ๋А๋‚Œ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์˜ˆ์ œ 1๋ฒˆ์€ $0\degree \rightarrow 120\degree \rightarrow 330 \degree \rightarrow 60 \degree \rightarrow 0$ ์ธ๊ฑฐ ๊ฐ™๋‹ค! $45\degree = 225\degree$๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , ๊ฐ€๊นŒ์šด ๊ณณ์„ ์ฐพ์•„์„œ ๋‘๋ฐฐ๋กœ ๋„˜๊ธฐ๊ณ , 360์œผ๋กœ ๋ชจ๋“ˆ๋Ÿฌ๋ฅผ ์ทจํ•˜์ž. ์ž, ์ด์ œ ํ•œ๋ฒˆ์”ฉ ์จ์„œ 0๋„๋กœ ๋Œ์•„์˜ค๋Š”๊ฑธ ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์ง€? $15\degree$๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”๊ฑด $30\degree$ $x\degree$๋ฅผ $a$์— ๋Œ€์นญ์ด๋™์‹œํ‚ค๋ฉด $(2a - x) \degree$๊ฐ€ ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค! ์ด๊ฑธ ๋˜ $b$์— ๋Œ€์นญ์ด๋™์‹œํ‚ค๋ฉด $(2b - (2a - x))\degree$ ์ธ๊ฑฐ๊ฐ™๊ณ .. ๊ทธ๋Ÿฌ๋ฉด ํ”Œ๋งˆ๋กœ ๋ฐ”๋€Œ์–ด๊ฐ€๋ฉด์„œ ๋”ํ•ด์ง€๋‹ˆ๊นŒ ๊ฒฐ๊ตญ ๋ชจ๋“ˆ๋Ÿฌ 360์— ๋Œ€ํ•ด ๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆˆ ํ•ฉ์„ ์ผ์ •ํ•˜๊ฒŒ ๋งž์ถœ ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๋ฌธ์ œ๋กœ ๋ฐ”๋€๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N; cin >> N; vector<int> A(N); rep(i, 0, N) cin >> A[i]; if(N%2){ cout << "NO"; return; } int sum = 0; for(auto x: A) sum += x; sum %= 360; DP[0][0][0] = true; rep(i, 0, N) rrep(j, 0, N) rep(k, 0, 360) if(DP[i][j][k]){ int nxt = (k + A[i]*2) % 360; DP[i+1][j+1][nxt] = true; DP[i+1][j][k] = true; } if(DP[N][N/2][sum] || DP[N][N/2][(sum + 180) % 360]){ cout << "YES\n"; vector<bool> used(N); int ci = N, cj = N/2, cs = sum; if(!DP[N][N/2][sum]) cs = (sum + 180) % 360; while(cj){ int prv = (cs - A[ci-1]*2) % 360; if(prv < 0) prv += 360; if(DP[ci-1][cj - 1][prv]){ used[ci-1] = true; ci--; cj--; cs = prv; } else ci--; } vector<int> v1, v2; rep(i, 0, N){ if(used[i]) v1.push_back(i+1); else v2.push_back(i+1); } rep(i, 0, N/2){ cout << v1[i] << ' ' << v2[i] << ' '; } } else cout << "NO"; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 30208 ํœด๊ฐ€ ๋‚˜๊ฐ€๊ธฐ

·244 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/30208 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์—…๋ฌด๋“ค์˜ ์ˆœ์„œ๋•Œ๋ฌธ์—, ์ž์œ ๋กญ๊ฒŒ ์„ ํƒํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๋“ค์ด ์ƒ๊ธด๋‹ค. ์ด๊ฒŒ ์–ด๋–ค ๋А๋‚Œ์ด์ง€? ![[Drawing 2026-02-07 15.51.45.excalidraw.png]] ์˜ˆ์ œ ์ž…๋ ฅ 1์˜ ์ˆœ์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค. $1 \rightarrow 2 \rightarrow 3$์„ ๋ณด์ž. $1$๊นŒ์ง€ ์ˆ˜ํ–‰ํ•ด์„œ ์ค‘์š”๋„ $w_1$, ์ฒ˜๋ฆฌ์‹œ๊ฐ„ $t_1$์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. $2$๊นŒ์ง€ ์ˆ˜ํ–‰ํ•ด์„œ ์ค‘์š”๋„ $w_1 + w_2$, ์ฒ˜๋ฆฌ์‹œ๊ฐ„ $t_1 + t_2$๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. $3$๊นŒ์ง€ ์ˆ˜ํ–‰ํ•ด์„œ $\cdots$ ์ €๋ ‡๊ฒŒ ๋ฌผ๊ฑด์„ ๋งŒ๋“ค๊ณ  ๋‚˜๋ฉด, ์„ธ๊ฐœ์ค‘์—์„œ ํƒ1์„ ํ•˜๋Š”๊ฒƒ ๋นผ๊ณ ๋Š” ๋ฐฐ๋‚ญ๋ฌธ์ œ์™€ ๋™์ผํ•ด์ง„๋‹ค. ํŠธ๋ฆฌ dfs๋กœ ๋ƒ…์ƒ‰์„ ์ž˜ ๋Œ๋ฉด์„œ DP๋ฅผ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทผ๋ฐ ์•ˆ์—์„œ ๋ถ„๊ธฐ๊ฐ€ ์ผ์–ด๋‚˜๋ฉด… 0์ด ์•„๋‹Œ ๋ชจ๋“  $p_i$๋“ค์€ ๋ชจ๋‘ ๋‹ค๋ฅด๋‹ค ๋ผ๋Š” ๋ฌธ์žฅ์ด ์ž…๋ ฅ์— ์žˆ๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void dfs(int cur, int root, int w, int t){ w += W[cur]; t += T[cur]; bags[root].push_back({w, t}); for(auto nxt: links[cur]) dfs(nxt, root, w, t); } void solve(){ cin >> N >> S; rep(i, 1, N+1) cin >> W[i]; rep(i, 1, N+1) cin >> T[i]; rep(i, 1, N+1){ int p; cin >> p; links[p].push_back(i); } for(auto nxt: links[0]) dfs(nxt, nxt, 0, 0); rep(i, 0, N+2) rep(j, 0, S+1) KS[i][j] = 1e9; KS[0][0] = 0; rep(i, 0, N+1) rep(j, 0, S+1) { KS[i+1][j] = min(KS[i+1][j], KS[i][j]); for(auto [w, t]: bags[i]){ int nxt = min(S, j + w); // } KS[i+1][nxt] = min(KS[i+1][nxt], KS[i][j] + t); } } if(KS[N+1][S] == 1e9) cout << -1; else cout << KS[N+1][S]; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 4013 ATM

·212 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/4013 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๊ทธ๋ž˜ํ”„๊ฐ€ DAG๋ผ๋ฉด ์œ„์ƒ์ •๋ ฌ์„ ํ•˜๋ฉด์„œ DP๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์„ํ…๋ฐ.. ๊ฐ™์€ ์ •์ ์„ ์—ฌ๋Ÿฌ๋ฒˆ ๋“ค๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์–ด๋–ค ์ •์ ์ด ์‚ฌ์ดํด ์•ˆ์— ๋“ค์–ด์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์‚ฌ์ดํด ๋‚ด์˜ ATM์„ ๋ชจ๋‘ ๋“ค๋ฆด ์ˆ˜ ์žˆ๋‹ค! ์„œ๋กœ ์ž์œ ๋กญ๊ฒŒ ์ด๋™ ๊ฐ€๋Šฅํ•œ ๊ด€๊ณ„๋ผ๋ฉด ๋ชจ๋‘ ์ž์œ ๋กญ๊ฒŒ ๋“ค๋ฆด ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ์ด๋ฅผ SCC๋กœ ๋ฌถ์–ด DAG๋กœ ๋งŒ๋“ค์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ cin >> N >> M; DirectedGraph graph(N+1); rep(i, 0, M){ int u, v; cin >> u >> v; graph.add_edge(u, v); } DirectedGraph dag = graph.getCompressedGraph(); int sz = dag.V; vector<int> val(sz), DP(sz, -1e9), indeg(sz, 0); rep(i, 1, N+1){ int X; cin >> X; val[graph.sccId[i]] += X; } int S, P; cin >> S >> P; S = graph.sccId[S]; DP[S] = val[S]; rep(u, 0, sz) for(auto &v: dag.links[u]) indeg[v]++; queue<int> Q; rep(i, 0, sz) if(indeg[i] == 0) Q.push(i); while(!Q.empty()){ int cur = Q.front(); Q.pop(); for(auto nxt: dag.links[cur]){ DP[nxt] = max(DP[nxt], DP[cur] + val[nxt]); indeg[nxt]--; if(indeg[nxt] == 0) Q.push(nxt); } } int ans = 0; rep(i, 0, P){ int X; cin >> X; X = graph.sccId[X]; ans = max(ans, DP[X]); } cout << ans << '\n'; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 10671 Grass Cownoisseur

·796 words·4 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: ๋ฒˆ์—ญ ๋ฌธ์ œ # Farmer John์€ ์†Œ๋“ค์˜ ๋ฐฉ๋ชฉ ํŒจํ„ด์„ ๋” ์ž˜ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ๋†์žฅ ์ „์ฒด์— ์ผ๋ฐฉํ†ตํ–‰ ์†Œ ๊ธธ๋“ค์„ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋†์žฅ์€ N๊ฐœ์˜ ๋ชฉ์ดˆ์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์œผ๋ฉฐ, ํŽธ์˜์ƒ 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๊ณ , ๊ฐ ์ผ๋ฐฉํ†ตํ–‰ ์†Œ ๊ธธ์€ ํ•œ ์Œ์˜ ๋ชฉ์ดˆ์ง€๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชฉ์ดˆ์ง€ X์—์„œ ๋ชฉ์ดˆ์ง€ Y๋กœ ์—ฐ๊ฒฐ๋˜๋Š” ๊ธธ์ด ์žˆ๋‹ค๋ฉด, ์†Œ๋“ค์€ X์—์„œ Y๋กœ๋Š” ์ด๋™ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ Y์—์„œ X๋กœ๋Š” ์ด๋™ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

BOJ 32607 Museum Visit

·698 words·4 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/32607 ๋ฒˆ์—ญ ํ๋กœ๋‹์–ธ ๋ฐ•๋ฌผ๊ด€ ๋ฐฉ๋ฌธ ๋ฌธ์ œ # ํ๋กœ๋‹์–ธ ๋ฐ•๋ฌผ๊ด€์—์„œ๋Š” ๋งค์ผ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์–ด๋–ค ๋‚ ์€ ์ข‹๊ณ  ํ‰ํ™”๋กญ๊ณ  ์กฐ์šฉํ•ด์„œ, ํ•˜๋ฃจ ์ข…์ผ ์•„๋ฆ„๋‹ค์šด ๊ทธ๋ฆผ, ์กฐ๊ฐ, ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ์˜ˆ์ˆ  ์ž‘ํ’ˆ๋“ค์„ ๊ฐ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋‚ ๋“ค์€ ๋” ๋ฐ”์œ๋ฐ, ์ฃผ๋ง์ด๋‚˜ ๊ณตํœด์ผ์—๋Š” ์„œ๋‘๋ฅด๋Š” ๋ฐฉ๋ฌธ๊ฐ๋“ค, ๋†’์•„์ง„ ์ž…์žฅ๋ฃŒ, ๊ทธ๋ฆฌ๊ณ  ์†Œ๋ฆฌ์ง€๋ฅด๋Š” ์•„์ด๋“ค๋กœ ๋ฐ•๋ฌผ๊ด€์ด ๊ฐ€๋“ ์ฐน๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์€ ๋งค์šฐ ๋‹ค์–‘ํ•ฉ๋‹ˆ๋‹ค: ์–ด๋–ค ๋ฐ”์œ ๋‚ ์€ ์ถ”๊ฐ€ ํ•™์ƒ ํ• ์ธ(studentenkorting) ๋•๋ถ„์— ๋” ๋‚˜์„ ์ˆ˜ ์žˆ๊ณ , ์–ด๋–ค ์กฐ์šฉํ•œ ๋‚ ์€ ์ง€์ง„ ์œ„ํ—˜ ๋•Œ๋ฌธ์— ๋” ๋‚˜๋น ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.