Skip to main content

DP

BOJ 14587 ๋„๋ฏธ๋…ธ (Large)

·224 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/14587 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์ „์ฒ˜๋ฆฌ๋ฅผ ์ ๋‹นํžˆ ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ด๋ถ„ํƒ์ƒ‰์„ ์ข€ ํ•˜๋ฉด์„œ ๋ฐ€๋ฉด์„œ ํ•˜๋ฉด, ํŠน์ • ๋„๋ฏธ๋…ธ๋ฅผ ํ•œ์ชฝ์œผ๋กœ ๋ฐ€์—ˆ์„๋•Œ ์–ด๋””๊นŒ์ง€ ๋„˜์–ด๊ฐ€๋Š”์ง€ ํ•  ์ˆ˜ ์žˆ๋‚˜? ์•„, min/max ์„ธ๊ทธ๋จผํŠธ ํŠธ๋ฆฌ๋กœ ๋˜๋Š”๊ฑฐ๊ฐ™๋‹ค ๋งˆ์ง€๋ง‰์€ ๊ทธ๋ฆฌ๋””๊ฐ€ ์•„๋‹ˆ๋ผ DP๋กœ ํ•ด์•ผํ•œ๋‹ค! ์•„๋‹ˆ๊ทผ๋ฐ X๊ฐ€ ์ •๋ ฌ๋˜์–ด ์ฃผ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค;;;;; ๊ทธ๋ž˜๋„ ๊ตฌํ˜„์ด ๋ง‰ ์–ด๋ ต์ง€ ์•Š์€๋“ฏ ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N; cin >> N; vector<ll> X(N), H(N); vector<pll> dominos(N); rep(i, 0, N) cin >> dominos[i].first >> dominos[i].second; sort(all(dominos)); rep(i, 0, N){ X[i] = dominos[i].first; H[i] = dominos[i].second; } SegmentTreeMinMax ST_min(N), ST_max(N); // calc leftmost ST_min.set(0, 0); rep(i, 1, N){ ll val = X[i] - H[i]; auto idx = lower_bound(all(X), val) - X.begin(); auto Q = ST_min.query(idx, i-1); ST_min.set(i, min((ll)i, ST_min.query(idx, i-1).first)); } // calc rightmost ST_max.set(N-1, N-1); rrep(i, 0, N-1){ ll val = X[i] + H[i]; auto idx = upper_bound(all(X), val) - X.begin() - 1; auto Q = ST_min.query(i+1, idx); ST_max.set(i, max((ll)i, ST_max.query(i+1, idx).second)); } vector<int> DP(N, 1e9); DP[0] = 1; DP[ST_max.get_val(0)] = 1; rep(i, 1, N){ int lft = ST_min.get_val(i)-1; if(lft < 0) DP[i] = 1; else DP[i] = min(DP[i], DP[lft] + 1); int rht = ST_max.get_val(i); DP[rht] = min(DP[rht], DP[i-1] + 1); } cout << DP[N-1]; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 1006 ์Šต๊ฒฉ์ž ์ดˆ๋ผ๊ธฐ

·539 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/1006 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์œ ๋ช…ํ•œ ํ†ต๊ณก์˜ ๋ฒฝ ๋ฌธ์ œ ์ดˆ๋ผ๊ธฐ ๋ฌธ์ œ๊ฐ€ $2 \times N$์˜ ์›ํ˜•์ด๋ผ ์กฐ๊ธˆ ๊ณค๋ž€ํ•˜๋‹ค. ์‰ฌ์šด ๊ฒฝ์šฐ๋ถ€ํ„ฐ ์ƒ๊ฐํ•˜์ž. $1 \times N$์˜ ์„ ํ˜•์ด๋ผ๋ฉด, ๊ณ„๋‹จ ์ˆ˜์ฒ˜๋Ÿผ DP๋กœ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. $2 \times N$์˜ ์„ ํ˜•์ด๋ผ๋„ DP๋กœ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™๋‹ค. ๋‘์นธ ์ „์—์„œ ์˜ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฐ€๋กœ๋‘๊ฐœ / ์œ„์— ๊ฐ€๋กœ์™€ ์•„๋ž˜ ๋”ฐ๋กœ / ์•„๋ž˜ ๊ฐ€๋กœ์™€ ์œ„์— ๋”ฐ๋กœ ํ•œ์นธ ์ „์—์„œ ์˜ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์„ธ๋กœ / ์œ„์•„๋ž˜ ๋”ฐ๋กœ ์ด 5๊ฐ€์ง€ ๊ฒฝ์šฐ์—์„œ ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™๋‹ค! ๊ทธ๋Ÿฐ๋ฐ ์›ํ˜•์ด๋ผ ์กฐ๊ธˆ ๊ณค๋ž€ํ•œ๋ฐ.. ๋ญ”๊ฐ€ ์ผ€์ด์Šค๋ฅผ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๊ธด ํ•˜๋‹ค. ์„ ํ˜•์œผ๋กœ ์ƒ๊ฐํ–ˆ์„๋•Œ ๋งจ ์™ผ์ชฝ์— ๋Œ€ํ•ด, ๊ทธ๊ฒŒ ๋ฐ˜๋Œ€์ชฝ๊ณผ ์ด์–ด์ง„๊ฒฝ์šฐ / ์•ˆ์ด์–ด์ง„๊ฒฝ์šฐ. ์œ„์•„๋ž˜๋‹ˆ๊นŒ ๊ฐ๊ฐ ๋‘๊ฐ€์ง€, ์ด 4๊ฐ€์ง€ ๊ฒฝ์šฐ์˜์ˆ˜๋ฅผ ๋”ฐ์ง€๋ฉด ๋ ๋“ฏ? ๊ทผ๋ฐ ์ด๊ฑธ ์–ด๋–ป๊ฒŒ ๊น”๋”ํ•˜๊ฒŒ ์ฝ”๋”ฉํ•˜์ง€? ํฐ์ผ๋‚ฌ๋‹ค. ๋‘˜๋‹ค ๋ฐ˜๋Œ€์ชฝ๊ณผ ์ด์–ด์ง„ ๊ฒฝ์šฐ๋Š” ๋ฌธ์ œ๋ฅผ ํ•œ์นธ ๋ฐ€์–ด์„œ ํ’€๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, ํ•œ์ชฝ๋งŒ ๋ฐ€๋ฆฐ ๊ฒฝ์šฐ๊ฐ€ ๊นŒ๋‹ค๋กญ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‚ฌ์‹ค ๋ชจ๋“  ์นธ์ด ์ง€๊ทธ์žฌ๊ทธ๋กœ ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ ๋นผ๊ณ ๋Š” ์–ธ์  ๊ฐ€๋Š” ์„ ํ˜•์œผ๋กœ ํ’€์–ด๋„ ๋˜๋Š” ํƒ€์ด๋ฐ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค! ์œ„์—์„œ ๋งํ•œ ํƒ€์ด๋ฐ์€ ์˜ˆ์ œ์—์„œ๋Š” $1-2, 10-11, 3-4, \cdots$๋กœ ์—ฐ๊ฒฐ๋œ ๋А๋‚Œ๊ณผ ๊ฐ™๋‹ค. ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ $O(NW)$์ด ๋˜๊ธด ํ•˜๋Š”๋ฐ, ๋Œ๋งŒํ•˜์ง€ ์•Š์„๊นŒ? ์ € ์ง€๊ทธ์žฌ๊ทธ๋งŒ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ฒ„๋ฆฌ์ž. ใ„ฒใ…‚ ์‹œ๊ฐ„์ดˆ๊ณผ๋„ค. ํ…Œ์ผ€๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ ๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™๋‹ค. ์—ฅ? ์ด๊ฑฐ ๊ทธ๋ƒฅ ๊ธธ์ด๋ฅผ $2N$์œผ๋กœ ๋Š˜๋ ค์„œ ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ? …์ธ์ค„์•Œ์•˜๋Š”๋ฐ ์ „์ด์‹ ์ž์ฒด๋ถ€ํ„ฐ ๋‘๊ฐœ ์ „์—์„œ ๋•ก๊ฒจ์˜ค๋‹ค๋ณด๋‹ˆ ์ฐจ๋ถ„ํŠธ๋ฆญ์ด ์•ˆ๋จนํžˆ๋Š”๊ฒƒ ๊ฐ™๋‹ค. ์ „์ด์‹ ์ž์ฒด์—์„œ๋„ ์—ฌ๋Ÿฌ์นธ ๋‹จ์œ„๋กœ ์ง€๊ทธ์žฌ๊ทธ๋กœ ์˜ค๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š”๊ฒŒ ์—†๋‹ค.. DP์—์„œ, ์ƒํƒœ๊ณต๊ฐ„์„ ์กฐ๊ธˆ ๋” ์ •์˜ํ•ด๋ณด์ž. $\text{DP}[i][j]$๋ผ๊ณ  ํ•˜๋ฉด, i๋ฒˆ์งธ์นธ๊นŒ์ง€ ๋ดค์„๋•Œ ์œ„์•„๋ž˜ ์ฐฌ๊ฒŒ j์ƒํ™ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. $j = 0, 1, 2, 3$์—์„œ ์œ„์•„๋ž˜ ๋ชจ๋‘ ๋น”, ์œ„ ์ฐธ, ์•„๋ž˜ ์ฐธ, ์œ„์•„๋ž˜ ๋ชจ๋‘ ์ฐธ๊ณผ ๊ฐ™์€ ๋А๋‚Œ์ด๋‹ค. ์ด๋ ‡๊ฒŒํ•ด์„œ ์ „์ด์‹์„ ์ž˜ ์„ธ์šฐ๋ฉด ์ € ์˜ˆ์™ธ์ƒํ™ฉ๋“ค์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์šฉ์ดํ•  ๊ฒƒ ๊ฐ™๋‹ค. 3๋ฒˆ์€ 0๋ฒˆ๊ณผ ๊ฐ™์œผ๋‹ˆ ์—†์• ๊ณ , ๋‚˜๋จธ์ง€ 3๊ฐœ๋กœ ์ •๋ง ์ž˜ ์ฒ˜๋ฆฌํ•ด๋ณด์ž… ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ ll N, W; cin >> N >> W; vector<array<ll, 2>> v(N); rep(i, 0, N) cin >> v[i][0]; rep(i, 0, N) cin >> v[i][1]; auto calc = [&](bool con1, bool con2) { vector<array<ll, 3>> DP(N+1); // 0: ๋‘˜๋‹ค๋, 1: ์œ„๊ฐ€ ํŠ€์–ด๋‚˜๊ฐ, 2: ์•„๋ž˜๊ฐ€ ํŠ€์–ด๋‚˜๊ฐ rep(i, 0, N+1) rep(j, 0, 3) DP[i][j] = 1e18; DP[0][0] = 0; if(con1) DP[0][1] = 0; if(con2) DP[0][2] = 0; if(con1 && con2) DP[1][0] = 0; rep(i, 1, N+1){ DP[i][0] = min(DP[i][0], DP[i-1][0] + (v[i-1][0] + v[i-1][1] <= W ? 1 : 2)); DP[i][0] = min(DP[i][0], DP[i-1][1] + 1); DP[i][0] = min(DP[i][0], DP[i-1][2] + 1); if(i-2 >= 0 && v[i-2][0]+v[i-1][0] <= W && v[i-2][1]+v[i-1][1] <= W){ DP[i][0] = min(DP[i][0], DP[i-2][0] + 2); } DP[i][1] = min(DP[i][1], DP[i][0] + 1); if((i == N && con1) || (i < N && v[i-1][0] + v[i][0] <= W)){ DP[i][1] = min(DP[i][1], DP[i-1][0] + 2); DP[i][1] = min(DP[i][1], DP[i-1][2] + 1); } DP[i][2] = min(DP[i][2], DP[i][0] + 1); if((i == N && con2) || (i < N && v[i-1][1] + v[i][1] <= W)){ DP[i][2] = min(DP[i][2], DP[i-1][0] + 2); DP[i][2] = min(DP[i][2], DP[i-1][1] + 1); } } if(!con1 && !con2) return DP[N][0]; if(con1 && !con2) return DP[N-1][2] + 1; if(!con1 && con2) return DP[N-1][1] + 1; if(con1 && con2) return DP[N-1][0] + 2; }; auto origin = v; ll ans = 2*N; rep(con1, 0, 2) rep(con2, 0, 2){ if(con1 && v[0][0] + v[N-1][0] > W) continue; if(con2 && v[0][1] + v[N-1][1] > W) continue; ans = min(ans, calc(con1, con2)); } cout << ans << '\n'; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 2803 ๋‚ด๊ฐ€ ์–ด๋ ธ์„ ๋•Œ ๊ฐ€์ง€๊ณ  ๋†€๋˜ ์žฅ๋‚œ๊ฐ

·401 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/2803 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋น„ํŠธ๋งˆ์Šคํ‚น์ ์œผ๋กœ ์ ‘๊ทผํ•ด๋ณด๋ฉด, ์—ฌ๋Ÿฌ ์žฅ๋‚œ๊ฐ ์ƒ์ž๋“ค์˜ or ์—ฐ์‚ฐ๊ฒฐ๊ณผ๊ฐ€ $1111111..$์ด ๋˜๋„๋ก ํ•˜๋Š” ์กฐํ•ฉ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ์œผ๋ฉด ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. $N$์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ธด ๊นŒ๋‹ค๋กœ์šฐ๋ฏ€๋กœ, $M \leq 20$์ธ ๊ฒƒ์„ ์ด์šฉํ•ด์„œ $M$์— ๋Œ€ํ•œ ๋น„ํŠธ๋งˆ์Šคํ‚น๋œ ์ƒ์ž์˜ ์ˆ˜๋กœ ์ƒ๊ฐํ•ด๋ณด์ž. ์ดํ›„ ๊ณผ์ •์„ ํฌํ•จ๋ฐฐ์ œ๋กœ ์ง„ํ–‰ํ•˜๋ฉด $O(2^N \times 2^N)$์ด๊ฒ ์ง€๋งŒ, ์šฐ๋ฆฌ๋Š” SOS DP๋ฅผ ์ด์šฉํ•ด์„œ $O(N2^N)$ ์— ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ทธ๋ƒฅ ๊ธฐ๋ณธ์ ์ธ SOS DP๋ž‘์€ ์„ธํŒ…์ด ์กฐ๊ธˆ ๋‹ค๋ฅธ๊ฐ€? ๊ณ ๋ฏผํ•ด๋ณด์ž. ๊ธฐ๋ณธ์ ์ธ SOS DP๋Š” ํ•ด๋‹น ๋น„ํŠธ๋งˆ์Šคํฌ์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์›์†Œ ๊ฐœ์ˆ˜์˜ ํ•ฉ์ด๋‹ค. ์ด๋ฒˆ์— ๊ตฌํ•ด์•ผํ•˜๋Š”๊ฑด ํ•ด๋‹น ๋น„ํŠธ๋งˆ์Šคํฌ๋ฅผ ๋งŒ๋“ค์–ด์ค„ ์ˆ˜ ์žˆ๋Š” ์กฐํ•ฉ์˜ ๊ฐœ์ˆ˜์ธ๋ฐ.. ๊ฒฐ๊ตญ ์–ด๋–ค ์ƒ์ž $110011$์„ ๊ณจ๋ž๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด, $??11??$ ์ธ๊ฑธ ๋ชจ๋‘ ๊ณ ๋ฅด๋ฉด ๋œ๋‹ค. ์ด๊ฑธ ๋ถ€๋ถ„์ง‘ํ•ฉ์œผ๋กœ ์„ธ๊ธด ํž˜๋“ค์ง€๋งŒ, ๋’ค์ง‘์–ด์„œ ์ƒ๊ฐํ•œ๋‹ค๋ฉด $??00??$์„ ์ฐพ๋Š” ๊ฒƒ์ด๊ณ , ์ด๊ฑด $110011$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ๊ฐœ์ˆ˜์™€ ๊ฐ™์€ ๊ฒƒ ๊ฐ™๋‹ค! ์ž๊ธฐ ์ž์‹ ์„ ์„ธ์ง€ ์•Š๋„๋ก ์กฐ์‹ฌํ•˜์ž. ๊ทธ๋Ÿฐ๋ฐ ์ € ๋ฐฉ๋ฒ•์œผ๋กœ ์„ธ๋ฉด, ๋‘๊ฐœ์˜ or์—ฐ์‚ฐ๋ฐ–์— ๊ณ ๋ คํ•˜์ง€ ๋ชปํ•œ๋‹ค… 3๊ฐœ ์ด์ƒ์ธ๊ฑธ ๊ณ ๋ คํ•˜๋ ค๋ฉด DP ์„ค๊ณ„๋ฅผ ์กฐ๊ธˆ ๋” ์ž˜ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค. ์•„ํ•˜, ์›๋ž˜๊ฒŒ $??11??$์ธ ๊ฐœ์ˆ˜๋ฅผ ์•ˆ๋‹ค๋ฉด, ์—ฌ๊ธฐ์—์„œ ํ•œ๊ฐœ ์ด์ƒ๋งŒ ๊ณ ๋ฅด๋ฉด ๋œ๋‹ค. ๊ทธ ๊ฐœ์ˆ˜๋ฅผ $\text{cnt}$๋ผ๊ณ  ํ•˜๋ฉด, $2^{\text{cnt}} - 1$์ด ์„ฑ๋ฆฝํ•˜๋Š”๊ฑฐ ๊ฐ™๊ธฐ๋„? ๊ทผ๋ฐ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ, ๋ญ๋ž„๊นŒ ์›๋ž˜๊ฐ€ $??10??$$ ์ธ๊ฑฐ๋ž‘ $??01??$$ ์ธ๊ฑฐ๋ž‘์ด ํ•ฉ์ณ์ ธ์„œ ๋˜๋Š”๊ฒƒ๋“ค์„ ๋ชป์„ธ๋Š”๊ฑฐ..๊ฐ™๊ธฐ๋„? ์—ฐ์‚ฐํ•ด์„œ $11$์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„ , $(11 + 10 + 01 + 00)^2$ ๊ฐ™์€ ๋А๋‚Œ์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด์ž. ์ € ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋Š” $$ 11^2 + 10^2 + 01^2 + 00^2 + \\ 2(11\cdot10 + 11\cdot01 + 11\cdot00 + 10\cdot01 + 10\cdot00 + 01\cdot00) $$ ์ด๊ณ , ์ž˜ ๊ณ ๋ฏผํ•ด๋ณด๋‹ˆ $11$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์ œ๊ณฑ - $11, 01$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์ œ๊ณฑ - $00$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ์ œ๊ณฑ์„ ํ•˜๋ฉด ๊น”๋”ํ•˜๊ฒŒ $11^2 + 2(11\times10 + 11\times01 + 11\times00 + 10\times01)$์ด ๋œ๋‹ค. ์•„๋‹ˆ ์ž ๊น๋งŒ, ์ € ๋А๋‚Œ์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๊ฐ€๋ฉด ๊ทธ๋ƒฅ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํ•ฉ์œผ๋กœ SOS DP๋ฅผ ํ•œ๋‹ค์Œ์— ํฌํ•จ๋ฐฐ์ œ๋ฅผ ๋•Œ๋ ค๋ฒ„๋ฆฌ๋ฉด ์–ด๋–ป๊ฒŒ๋“  ๋œ๋‹ค. ์—ฐ์‚ฐ๊ฒฐ๊ณผ๊ฐ€ $11...11$์ธ๋†ˆ๋“ค - $(01...11), (10..111)...$ + $...$ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋˜๋Š”๊ตฌ๋‚˜! ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ int N, M; cin >> N >> M; vector<int> A(N); rep(i, 0, N){ int K; cin >> K; int ret = 0; rep(j, 0, K){ int x; cin >> x; ret |= (1 << (x-1)); } A[i] = ret; } vector<int> SOS(1 << M, 0); for(auto x: A) SOS[x] += 1; rep(i, 0, M) rep(mask, 0, 1<<M) if(mask & (1 << i)) SOS[mask] += SOS[mask^(1<<i)]; mint ans = 0; rep(mask, 0, 1<<M){ int cnt = 0; rep(i, 0, M) if((mask & (1 << i)) == 0) cnt++; if(cnt & 1) ans -= (mint(2).pow(SOS[mask])); else ans += (mint(2).pow(SOS[mask])); } cout << ans << "\n"; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 24945 Copy ans Paste 3

·635 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/24945 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์„œ๋ธŒํƒœ์Šคํฌ๊ฐ€ ์ƒ๋‹นํžˆ ๋งŽ๊ณ , ๋ฌธ์ œ๊ฐ€ ์‰ฝ์ง€ ์•Š์•„๋ณด์ธ๋‹ค. ์ฐจ๊ทผ์ฐจ๊ทผ ํ•ด๋ณด์ž. $N = 3$ ๋ธŒ๋ฃจํŠธํฌ์Šค์— ๊ฐ€๊น๊ฒŒ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ๋ฌธ์ž๋Š” ์–ด์ฐจํ”ผ ์ตœ๋Œ€ 3๊ฐœ ์กด์žฌํ•˜๋ฏ€๋กœ, 3๊ฐœ์— ๋Œ€ํ•ด $X$๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ $3^3$๊ฐ€์ง€, $Y$๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ $3^3$๊ฐ€์ง€๋ฅผ ์ „์ดํ•˜๋ฉด์„œ ๋‹ค์ต์ŠคํŠธ๋ผ๋กœ ํ’€ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค. ใ…‡ใ…‹ ๋œ๋‹น $S_i = a$ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ a๋ผ๋ฉด? $X$์— ๋“ค์–ด์žˆ๋Š” ๋ฌธ์ž ๊ฐœ์ˆ˜, $Y$์— ๋“ค์–ด์žˆ๋Š” ๋ฌธ์ž ๊ฐœ์ˆ˜ ๋‘๊ฐ€์ง€๋ฅผ ์ด์šฉํ•ด์„œ $N^2$ ์ •์  ๋‹ค์ต์ŠคํŠธ๋ผ๊ฐ€ ๊ฐ€๋Šฅํ•ด๋ณด์ธ๋‹ค. $N \leq 30$ ์ด์ œ๋ถ€ํ„ฐ ์ง„์งœ๋กœ ์–ด๋–ป๊ฒŒํ’€์–ด์•ผํ•˜๋Š”์ง€ ๊ณ ๋ฏผํ•ด๋ด์•ผํ•  ๊ฒƒ ๊ฐ™์€๋ฐ… ์ผ๋‹จ ๋ณต์‚ฌํ•  ๋ฌธ์ž $Y$๋Š” $X$์˜ substr์ด์–ด์•ผํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ $Y$๊ฐ€ ๋  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜์ˆ˜๋Š” $O(N^2)$์ด๊ณ  $X$๋ฅผ ๋งŒ๋“ค๋•Œ๋“ , $Y$๋ฅผ ๋งŒ๋“ค๊ธฐ์œ„ํ•ด ๋นŒ๋“œ์—…ํ•˜๊ณ  ์žˆ์„๋•Œ๋“  ๊ฒฐ๊ตญ $X$๋„ $X$์˜ substr๋กœ ์กด์žฌํ•ด์•ผํ•œ๋‹ค. ์ด๊ฒƒ๋„ ๊ฒฝ์šฐ์˜์ˆ˜๊ฐ€ $O(N^2)$ ์ธ ๊ฒƒ ๊ฐ™๋‹ค. $Y$๋ฅผ ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฒ€์‚ฌํ•˜๋Š”? ๊ทธ๋Ÿฐ๊ฒƒ๋“ค์ด ์ „์ฒ˜๋ฆฌ๋ฅผ ์•ˆํ•˜๋ฉด $O(N)$์ฏค ๋˜์–ด๋ณด์ด๋‹ˆ, ์•„๋งˆ ์ข…ํ•ฉํ•ด์„œ $O(N^5)$์ •๋„๋กœ ํ’€ ์ˆ˜ ์žˆ์ง€ ์•Š๋‚˜? ๊ทผ๋ฐ DP ์ „์ด์‹์ด ํ—ท๊ฐˆ๋ฆฐ๋‹ค. ์ด๊ฒŒ ์ƒํ˜ธ ์ฐธ์กฐ๊ฐ€ ์—†๋‚˜? ๋น„์šฉ๋“ค์ด ๋‹ฌ๋ผ์„œ ๋‹ค์ต์œผ๋กœ ํ•ด์•ผ๋  ๊ฒƒ ๊ฐ™์€๋ฐ. $\text{DP}[x][y]$: ํ˜„์žฌ $X$์— $x$, $Y$์— $y$๊ฐ€ ๋“ค์–ด์žˆ๋‹ค๊ณ  ํ•˜์ž. $A$ ์—ฐ์‚ฐ์„ ๊ฑฐ์น˜๋ฉด $x$์— ํ•œ๊ฐœ๊ฐ€ ๋ถ™๊ณ , $y$๋Š” ๊ทธ๋Œ€๋กœ๋‹ค. $B$ ์—ฐ์‚ฐ์„ ๊ฑฐ์น˜๋ฉด $x$๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ๋˜๊ณ , $y$๋Š” $x$์˜ ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ๋œ๋‹ค. $C$์—ฐ์‚ฐ์„ ๊ฑฐ์น˜๋ฉด $x = x + y$๊ฐ€ ๋˜๊ณ , $y$๋Š” ๊ทธ๋Œ€๋กœ๋‹ค. ์•„ํ•˜, ์ƒ๊ฐ๋ณด๋‹ค $y$๊ฐ€ ๊ฐฑ์‹ ๋ ์ผ์ด ์—†๋‹ค. ๊ทธ๋ฆฌ๊ณ  $y$๊ฐ€ ๊ฐฑ์‹ ๋œ๋‹ค๋ฉด $x$๊ฐ€ ๋นˆ ๋ฌธ์ž์—ด์ด ๋œ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•œ๋‹ค! ๋ณต์‚ฌํ•˜๊ณ  ๋ถ™์—ฌ๋„ฃ๋Š” ๊ณผ์ •์„ ๊ทธ๋ƒฅ ํ•ด๋ฒ„๋ ธ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๊ฒŒ ๋” ์‰ฌ์šธ ๊ฒƒ ๊ฐ™๋‹ค. $\text{DP}[i][j]$ : $S_i$~$S_j$๊นŒ์ง€ ๋งŒ๋“œ๋Š” ์ตœ์†Œ๋น„์šฉ์ด๋ผ๊ณ  ํ•˜์ž. ์ด๊ฑด $\text{DP}[i][j-1]$ ํ›„ $A$์—ฐ์‚ฐ์„ ํ•˜๊ฑฐ๋‚˜ ์–ด๋–ค $i \leq i', j' \leq j$๊ฐ€ ์žˆ์–ด์„œ ๊ทธ์นœ๊ตฌ๋ฅผ ๋ณต์‚ฌํ•œ ํ›„ ๋ถ™์—ฌ๋„ฃ๊ธฐ๋ฅผ ์—ฌ๋Ÿฌ๋ฒˆ ํ•˜๊ฑฐ๋‚˜. ์ด๊ฑด ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ๋˜๋Š”๋“ฏ? ํ•œ๋ฒˆ ์งœ๋ณด์ž. ์˜ค!!! ์ด๊ฑธ๋กœ ๋Œ€์ถฉ $30^5$์ •๋„๋Š” ์„ฑ๊ณตํ–ˆ๋‹ค! $N \leq 200$ ์ด์ œ $O(N^4)$๋Š” 16์–ต์ด๋‹ˆ ๋นก์„ธ๊ณ , $O(N^3\log{N})$์ฏค ๊นŒ์ง€๋Š” ์ค„์—ฌ์•ผํ•˜๋Š”๋ฐ… ์„ญํƒœ 5๋Š” ์„ธ์ œ๊ณฑ, ์„ญํƒœ 6์€ ์ œ๊ณฑ๋กœ๊ทธ๊ฒ ๋‹ค. ์Œ, ์œ„์—์„œ ํ–ˆ๋˜ ๊ด€์ฐฐ๋Œ€๋กœ $Y$์— ๋ณต์‚ฌํ•ด์„œ ๋„ฃ์œผ๋ฉด $X$๋Š” ์ดˆ๊ธฐํ™”๋ผ์„œ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ, DP๋ฅผ $B$์—ฐ์‚ฐ์œผ๋กœ $Y$์— ๋ณต์‚ฌํ•œ๊ฑฐ๊นŒ์ง€ ํ–ˆ์„ ๋•Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜์ž. ์ ค ์ค‘์š”ํ•œ๊ฑฐ๋Š” ์ € ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ๋น„๊ตํ•˜๋ฉด์„œ ๋’ค๋กœ ์Š์Š์Š ๊ฐ€๋Š” ํŒŒํŠธ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ cin >> N >> S >> A >> B >> C; if(N >= mxN) { cout << -1 << "\n"; return; } rep(i, 0, N+1) rep(j, 0, N+1) DP[i][j] = LLONG_MAX; rep(i, 0, N+1) rep(j, i+1, N+1) DP[i][j] = A * (j-i) + B; const mint base = 131; const mint2 base2 = 137; vector<mint> hsh(N+1), pw(N+1); vector<mint2> hsh2(N+1), pw2(N+1); hsh[0] = 0; pw[0] = 1; hsh2[0] = 0; pw2[0] = 1; rep(i, 0, N){ hsh[i+1] = hsh[i] * base + S[i]; pw[i+1] = pw[i] * base; hsh2[i+1] = hsh2[i] * base2 + S[i]; pw2[i+1] = pw2[i] * base2; } auto getHash = [&](int l, int r) -> pair<ll, ll>{ ll ret1 = (hsh[r] - hsh[l] * pw[r-l]).get(); ll ret2 = (hsh2[r] - hsh2[l] * pw2[r-l]).get(); return {ret1, ret2}; }; ll ans = N*A; rep(L, 1, N+1){ // A ์—ฐ์‚ฐ ์•ž๋’ค์— ๋ถ™์—ฌ์„œ ์ „์ดํ•  ๋•Œ if(L >= 2) rep(s, 0, N){ if(s+L > N) break; int e = s+L; DP[s][e] = min(DP[s][e], DP[s+1][e]+A); DP[s][e] = min(DP[s][e], DP[s][e-1]+A); } // ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ๋ณต์‚ฌํ•˜๋Š” ์ตœ์†Œ ๋น„์šฉ map<pair<ll,ll>, vector<int>> mp; rep(s, 0, N){ if(s+L > N) break; int e = s+L; mp[getHash(s, e)].push_back(s); } // ๋ณต์‚ฌ ์—ฐ์‚ฐ์œผ๋กœ ์ „์ด for(auto& [_, v]: mp){ int sz = v.size(); ll mn = 1e18; for(auto s: v) mn = min(mn, DP[s][s+L]); // ๋‹ค์Œ์— ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜ vector<int> nxt(sz, sz); for(int i = 0, j = 0; i < sz; i++){ while(j < sz && v[j] < v[i]+L) j++; nxt[i] = j; } rep(i, 0, sz){ int s_pos = v[i]; int cidx = i; int cnt = 0; while(cidx < sz){ cnt++; int e_pos = v[cidx]+L; if(e_pos > N) break; DP[s_pos][e_pos] = min(DP[s_pos][e_pos], mn + (C * cnt) + ((e_pos - s_pos) - (L * cnt)) * A + B); cidx = nxt[cidx]; } } } } ans = min(ans, DP[0][N] - B); cout << ans << "\n"; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 27844 Fertilizing Pastures

·150 words·1 min
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/27844 ๋ฒˆ์—ญ ๋ฌธ์ œ ๋ฒˆ์—ญ # $N$๊ฐœ์˜ ๋ชฉ์ดˆ์ง€๊ฐ€ ์žˆ๊ณ  ($2 \le N \le 2\cdot 10^5$), $N-1$๊ฐœ์˜ ๋„๋กœ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ํŠธ๋ฆฌ๋ฅผ ํ˜•์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๋„๋กœ๋ฅผ ๊ฑด๋„ˆ๋Š” ๋ฐ 1์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ ๋ชฉ์ดˆ์ง€๋Š” ์ฒ˜์Œ์— ํ’€์ด 0๊ฐœ์ด๊ณ , $i$๋ฒˆ์งธ ๋ชฉ์ดˆ์ง€์˜ ํ’€์€ ์ดˆ๋‹น $a_i$ ($1\le a_i\le 10^8$) ๋‹จ์œ„์˜ ์†๋„๋กœ ์ž๋ž๋‹ˆ๋‹ค. Farmer John์€ ์ฒ˜์Œ์— ๋ชฉ์ดˆ์ง€ 1์— ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  ๋ชฉ์ดˆ์ง€์˜ ํ’€์— ๋น„๋ฃŒ๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด ๋Œ์•„๋‹ค๋…€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฐ€ $x$ ๋‹จ์œ„์˜ ํ’€์ด ์žˆ๋Š” ๋ชฉ์ดˆ์ง€๋ฅผ ๋ฐฉ๋ฌธํ•˜๋ฉด, $x$๋งŒํผ์˜ ๋น„๋ฃŒ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ชฉ์ดˆ์ง€๋Š” ์ฒ˜์Œ ๋ฐฉ๋ฌธํ•  ๋•Œ๋งŒ ๋น„๋ฃŒ๋ฅผ ์ฃผ๋ฉด ๋˜๊ณ , ๋น„๋ฃŒ๋ฅผ ์ฃผ๋Š” ๋ฐ๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

BOJ 10044 ๅฐ็ฑ ๅŒ… (Xiao Long Bao)

·513 words·3 mins
w## ๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด ๋งํฌ: https://www.acmicpc.net/problem/10044 ๋ฒˆ์—ญ ๋ฌธ์ œ # JOI ๊ตฐ์€ ์ ์‹ฌ์œผ๋กœ ์ค‘ํ™”์š”๋ฆฌ์ง‘์—์„œ ์ƒค์˜ค๋กฑ๋ฐ”์˜ค๋ฅผ ๋จน๊ธฐ๋กœ ํ–ˆ๋‹ค. ์ƒค์˜ค๋กฑ๋ฐ”์˜ค๋Š” ์†์žฌ๋ฃŒ์™€ ๋œจ๊ฑฐ์šด ๊ตญ๋ฌผ์„ ๋ฐ€๊ฐ€๋ฃจ ํ”ผ๋กœ ์‹ผ ์š”๋ฆฌ๋กœ, ๋จน์„ ๋•Œ ๊ตญ๋ฌผ์ด ์ฃผ์œ„๋กœ ํŠ€๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ๋‹ค. JOI ๊ตฐ์ด ์ฃผ๋ฌธํ•œ ์ƒค์˜ค๋กฑ๋ฐ”์˜ค ์„ธํŠธ๋Š” ์†์žฌ๋ฃŒ๋‚˜ ๊ตญ๋ฌผ์ด ๋‹ค๋ฅธ N๊ฐœ์˜ ์ƒค์˜ค๋กฑ๋ฐ”์˜ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. N๊ฐœ์˜ ์ƒค์˜ค๋กฑ๋ฐ”์˜ค๋Š” ๋“ฑ๊ฐ„๊ฒฉ์œผ๋กœ ์ผ๋ ฌ๋กœ ๋†“์—ฌ ์žˆ์œผ๋ฉฐ, ์ˆœ์„œ๋Œ€๋กœ 1๋ถ€ํ„ฐ N๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค. i๋ฒˆ์งธ ์ƒค์˜ค๋กฑ๋ฐ”์˜ค์™€ j๋ฒˆ์งธ ์ƒค์˜ค๋กฑ๋ฐ”์˜ค ์‚ฌ์ด์˜ ๊ฑฐ๋ฆฌ๋Š” ์ ˆ๋Œ“๊ฐ’ |i - j|์ด๋‹ค.

BOJ 28693 ์žฌ์šฐ์˜ ์นด๋“œ๊นก

·317 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/28693 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ๋ฌธ์ œ ์ƒํ™ฉ์„ ์ž˜ ์ƒ๊ฐํ•ด๋ณด์ž. $N$์ข…๋ฅ˜์˜ ์นด๋“œ $2N$๊ฐœ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž. ์ฒ˜์Œ์— ๊ณ ๋ฅธ ๋‘ ์นด๋“œ๊ฐ€ ๊ฐ™์€ ์Œ์ด๋ผ๋ฉด, $N-1$ ์ข…๋ฅ˜์˜ ์นด๋“œ $2(N-1)$๊ฐœ๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์ด ํ™•๋ฅ ์€ $\frac{1}{2N-1}$์ด๋‹ค. ์ฒ˜์Œ์— ๊ณ ๋ฅธ ๋‘ ์นด๋“œ๊ฐ€ ๋‹ค๋ฅธ ์Œ์ด๋ผ๋ฉด, 2๋ฒˆ์˜ ๊ธฐํšŒ๋ฅผ ๋” ์จ์„œ (์ด 3๋ฒˆ์˜ ๊ธฐํšŒ๋กœ) $N-2$์ข…๋ฅ˜์˜ ์นด๋“œ $2(N-2)$๊ฐœ๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค. ์ด ํ™•๋ฅ ์€ $\frac{2N-2}{2N-1}$์ด๋‹ค. …์ธ์ค„ ์•Œ์•˜๋Š”๋ฐ ์•„๋‹ˆ๋‹ค! ์ƒ๊ฐํ•ด๋ณด๋‹ˆ $N \geq 3$์ผ๋•Œ ๋‘๊ฐœ๋ฅผ ๊น๋‹ค๊ณ  ํ•ด์„œ ๋‚˜๋จธ์ง€์˜ ์œ„์น˜๋ฅผ ๋ชจ๋ฅธ๋‹ค.. ๊ทธ๋ ‡๋‹ค๋ฉด DP์‹์„ ์ƒˆ๋กญ๊ฒŒ ์„ธ์›Œ๋ณด์ž. $DP[N][K]$ : $N$ ์Œ์˜ ์•ˆ๊น ์นด๋“œ, $K$์ข…์˜ ์œ„์น˜๋ฅผ ์•„๋Š” ์นด๋“œ๊ฐ€ ์žˆ์„ ๋•Œ์˜ ๊ธฐ๋Œ“๊ฐ’ ์–ธ์ œ๋‚˜ ์•ˆ๊น ์นด๋“œ๋ฅผ ๋จผ์ € ๊นŒ๋Š”๊ฒŒ ์ตœ์ ์ธ๋ฐ, ๊ทธ๋ ‡๋‹ค๋ฉด $\frac{K}{2N+K}$์˜ ํ™•๋ฅ ๋กœ ์ด๋ฏธ ์œ„์น˜๋ฅผ ์•„๋Š” ์นด๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฑฐ๋‚˜ $\frac{2N}{2N+K}$์˜ ํ™•๋ฅ ๋กœ ์•ˆ๊น์นด๋“œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋Š”๋ฐ, ์ด๋•Œ $\frac{1}{2N+K-1}$์˜ ํ™•๋ฅ ๋กœ ํ•œ๋ฐฉ์— ๋งž์ถ”๊ฑฐ๋‚˜ $\frac{K}{2N+K-1}$์˜ ํ™•๋ฅ ๋กœ ์›๋ž˜ ์•Œ๋˜ ์Œ์ด ๋‚˜์™€์„œ, ๋‹ค์Œ ํ„ด์— ๊ทธ๊ฑธ ๋งž์ถ”๊ฑฐ๋‚˜ $\frac{2N-2}{2N+K-1}$์˜ ํ™•๋ฅ ๋กœ ์ƒˆ๋กœ์šด ์Œ์ด ๋‚˜์™€์„œ $K$๊ฐ€ 2 ๋Š˜์–ด๋‚˜๊ฑฐ๋‚˜ ์™€ ๊ฐ™์€ ์‹์œผ๋กœ ์ •๋ฆฌ๋œ๋‹ค. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): mint calc(int N, int K){ // $DP[N][K]$ : $N$ ์Œ์˜ ์•ˆ๊น ์นด๋“œ, $K$์ข…์˜ ์œ„์น˜๋ฅผ ์•„๋Š” ์นด๋“œ๊ฐ€ ์žˆ์„ ๋•Œ์˜ ๊ธฐ๋Œ“๊ฐ’ if(N < 0 || K < 0) return 0; if(N == 0) return mint(K); if(visited[N][K]) return DP[N][K]; visited[N][K] = true; mint res = 0; // ์œ„์น˜๋ฅผ ์•„๋Š” ์นด๋“œ๋ฅผ ๋ฝ‘๋Š” ๊ฒฝ์šฐ res += (mint(K) / mint(2*N+K)) * (calc(N, K-1) + 1); // ์œ„์น˜๋ฅผ ๋ชจ๋ฅด๋Š” ์นด๋“œ๋ฅผ ๋ฝ‘๋Š” ๊ฒฝ์šฐ // ๋‘๋ฒˆ์งธ ์นด๋“œ๊ฐ€ ์ฒซ๋ฒˆ์งธ ๋ฝ‘์€ ์นด๋“œ์™€ ๋งž๋Š” ๊ฒฝ์šฐ res += (mint(2*N) / mint(2*N+K)) * (mint(1) / mint(2*N+K-1)) * (calc(N-1, K) + 1); // ๋‘๋ฒˆ์งธ ์นด๋“œ๊ฐ€ ์ด๋ฏธ ์œ„์น˜๋ฅผ ์•„๋Š” ์นด๋“œ์™€ ๋งž๋Š” ๊ฒฝ์šฐ res += (mint(2*N) / mint(2*N+K)) * (mint(K) / mint(2*N+K-1)) * (calc(N-1, K) + 2); // ๋‘๋ฒˆ์งธ ์นด๋“œ๊ฐ€ ์•„์˜ˆ ์ƒˆ๋กœ์šด ์นด๋“œ์ผ ๊ฒฝ์šฐ res += (mint(2*N) / mint(2*N+K)) * (mint(2*N-2) / mint(2*N+K-1)) * (calc(N-2, K+2) + 1); return DP[N][K] = res; } void solve(){ int N; cin >> N; cout << calc(N, 0); } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 22348 ํ—ฌ๊ธฐ ์ฐฉ๋ฅ™์žฅ

·216 words·2 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/22348 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์•ˆ์—์„œ๋ถ€ํ„ฐ ๊ฐ ๋™์‹ฌ์›์— ๋Œ€ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ DP์‹์„ ์ƒ๊ฐํ•ด๋ณด์ž. $\text{DP}[i][j]$: $i$๋ฒˆ์งธ ๋™์‹ฌ์›๊นŒ์ง€ ๊ทธ๋ ธ์„ ๋•Œ $j$ํ†ต์˜ ๋นจ๊ฐ• ํŽ˜์ธํŠธ๋ฅผ ์“ฐ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜ ๊ทธ๋Ÿฌ๋ฉด ํŒŒ๋ž€ ํŽ˜์ธํŠธ๋Š” $\sum\limits_{k = 1}^i k - j$ ํ†ต ํ•„์š”ํ•˜๋‹ค. ์ด๊ฒŒ $b$์ดํ•˜๋ฉด ์—ฌ์œ ๋กญ๊ฒŒ ๋œ๋‹ค! ์‹œ๊ฐ„๋ณต์žก๋„๋Š”.. $a+b \leq 100000$์ด๋ฏ€๋กœ 500๋ฒˆ ์•ˆ์ชฝ์œผ๋กœ ๋๋‚ ๊ฑฐ๊ณ , ๊ทธ์— ๋งž์ถฐ ๋‚˜์ด๋ธŒํ•˜๊ฒŒ ๊ตฌํ•˜๋ฉด ์—…๋ฐ์ดํŠธ์— 5๋งŒ๋ฒˆ, ํ•ฉ์„ ๊ตฌํ•˜๋Š”๋ฐ 5๋งŒ๋ฒˆ์ด๋‹ˆ… 500 * 50000 = 25'000'000๋ฒˆ? ๊ทผ๋ฐ ํ…Œ์ผ€๊ฐ€ 10000๊ฐœ๋ผ๋Š” ์ด์Šˆ๊ฐ€ ์žˆ๋‹ค… ์ด๊ฑธ ๋” ์ค„์—ฌ์•ผ๋งŒ ํ•ด ์•„ํ•˜, ๋‹ค์‹œ ๋ณด๋‹ˆ๊นŒ DP์‹์€ ์•ˆ๋ฐ”๋€๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ๋ƒฅ $500 * 50000$ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด๋†“๊ณ , ๋ˆ„์ ํ•ฉ์„ ์ด์šฉํ•ด์„œ ํ•œ๋ฒˆ์— ๊ตฌํ•˜์ž. ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): void solve(){ vector<vector<mint>> DP(501, vector<mint>(50001, 0)), pfSum(501, vector<mint>(50002, 0)); DP[0][0] = 1; rep(i, 1, 501) rep(j, 0, 50001) DP[i][j] = DP[i-1][j] + (j >= i ? DP[i-1][j-i] : 0); rep(i, 0, 501) rep(j, 0, 50001) pfSum[i][j+1] = pfSum[i][j] + DP[i][j]; int tc; cin >> tc; while(tc--){ ll a, b; cin >> a >> b; ll sum = 0; mint ans = 0; rep(i, 1, 501){ sum += i; if(sum > a + b) break; ans += pfSum[i][min(a, sum) + 1] - pfSum[i][max(0LL, sum - b)]; } cout << ans << '\n'; } } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 19545 ์†Œ๊ฐ€ ๊ธธ์„ ๊ฑด๋„ˆ๊ฐ„ ์ด์œ  2020

·429 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/19545 ๐Ÿง ๊ด€์ฐฐ ๋ฐ ์ ‘๊ทผ # ์œ„์ชฝ๋™๋„ค ์†Œ๊ฐ€ $N$๋งˆ๋ฆฌ, ์•„๋ž˜์ชฝ ์†Œ๊ฐ€ $1$๋งˆ๋ฆฌ๋ผ๊ณ  ํ•ด๋ณด์ž. ๊ทธ๋Ÿฌ๋ฉด ์—ฐ๊ฒฐ ๋ฐฉ๋ฒ•์€ ์œ ์ผํ•˜๋‹ค. ์•„๋ž˜ ํ—›๊ฐ„์— ๋ชจ๋“  ์œ„์ชฝ ํ—›๊ฐ„์„ ์—ฐ๊ฒฐํ•ด์•ผํ•œ๋‹ค. ์•„๋ž˜์ชฝ ์†Œ๊ฐ€ $2$๋งˆ๋ฆฌ๋ผ๊ณ  ํ•ด๋ณด์ž. ์œ„์ชฝ ๋™๋„ค์˜ ์†Œ๋ฅผ $U_1, U_2, \cdots, U_k$๋ฅผ ํ—›๊ฐ„ $D_1$์—, $U_{k+1}, \cdots U_N$์„ $D_2$์— ์—ฐ๊ฒฐํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์„ ์ƒ๊ฐํ•ด๋ณด์ž. $\text{DP}[i][j]$: ์œ„์ชฝ ๋™๋„ค ์†Œ๋ฅผ $i$๋งˆ๋ฆฌ, ์•„๋ž˜์ชฝ ๋™๋„ค ์†Œ๋ฅผ $j$๋งˆ๋ฆฌ๋ฅผ ๋”ฑ ๋งค์นญ์‹œ์ผฏ์„๋•Œ ์ตœ์†Ÿ๊ฐ’ $\text{DP}[i][j] = min_{k < j}(DP[k][j-1] + \text{Cost}[k+1][i][j])$ ์œ„์™€ ๊ฐ™์€ ๋А๋‚Œ์˜ ์‹์ด ์„ฑ๋ฆฝํ•  ๊ฒƒ ๊ฐ™์€๋ฐ, Cost๋ฅผ ๊ตฌํ•˜๋Š”๊ฒƒ๋„, DP์‹์„ ๊ตฌํ•˜๋Š”๊ฒƒ๋„ ์‰ฝ์ง€ ์•Š์•„๋ณด์ธ๋‹ค. ํ•˜ ์ด ์‹์ด ๋ญ”๊ฐ€ ์œ„ / ์•„๋ž˜์ชฝ์— ๋Œ€ํ•ด ๋Œ€์นญ์ธ๊ฒŒ ์˜๋ฏธ์‹ฌ์žฅํ•œ๋ฐ… ์•„ ์Šค์ ์ด๊ฒŒ ๊นŒ๋‹ค๋กญ๋„ค.. ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์–ด๋–ค ๊ฐ„์„ ์„ ์—ฐ๊ฒฐํ–ˆ์„๋•Œ, ์™ผ์ชฝ/์˜ค๋ฅธ์ชฝ์— ๋‚จ๋Š” ๊ฐœ์ˆ˜๋ฅผ ๊ณฑํ•œ๋งŒํผ ์— ๊ทธ ๊ฒฝ๋กœ์˜ ๊ธธ์ด๋ฅผ ๊ณฑํ•œ๊ฒŒ ์ „์ฒด์— ๋”ํ•ด์ง€๋Š”๋ฐ ํ  ์•„๋‹ˆ๊ทผ๋ฐ ์•ฝ๊ฐ„ ๊ทธ๋ฆฌ๋””ํ•˜๊ฒŒ ์•ˆ๋˜๋‚˜? ์œ„๋ž‘ ์•„๋ž˜๋ž‘ ๊ฐ™์€ ์ขŒํ‘œ์ธ๊ฒŒ ์žˆ์œผ๋ฉด ์ด๊ฒŒ ๋ฌด์กฐ๊ฑด ์ž‡๋Š”๊ฒŒ ์ด๋“์ด ์•„๋‹ˆ๋ผ๊ณ ? ์™œ์ง€? ๊ฒฝ๋กœ๊ฐ€ ๊ธธ์–ด์งˆ์ˆ˜๊ฐ€ ์žˆ๋‚˜? ๊ทธ๋ฆผ์„ ์—ด์‹ฌํžˆ ๊ทธ๋ฆฌ๋‹ค๋ณด๋‹ˆ, ๊ฒฐ๊ตญ ๊ฐ„์„ ์€ ๋‘๊ฐ€์ง€๋กœ ๋‚˜๋‰œ๋‹ค. Type 1: ๋ฐ˜๋Œ€์ชฝ ์ •์ ์— ๊ฐ„์„ ์ด 3๊ฐœ ์ด์ƒ ์žˆ๊ณ  ๊ทธ ์ค‘๊ฐ„์— ์žˆ์–ด์„œ ํ•ด๋‹น ๊ฐ„์„ ์˜ ๊ฑฐ๋ฆฌ์— $N+M-1$์ด ๊ณฑํ•ด์ง„๋‹ค. Type 2: ๋ฐ˜๋Œ€์ชฝ ์ •์ ์˜ ๊ฐ€์žฅ์ž๋ฆฌ ๊ฐ„์„ ์ด๋ผ์„œ, ํ•ด๋‹น ๊ฐ„์„ ์ด $i - j$๋ฅผ ์ž‡๋Š”๋‹ค๋ฉด $(i+j-1)(N+M-(i+j-1))$์ด ๊ณฑํ•ด์ง„๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐ $\text{DP}[i][j]$์— ๋Œ€ํ•ด ๋งˆ์ง€๋ง‰ ์นœ๊ตฌ์— ๋Œ€ํ•ด ์œ„์— ๋ช‡๊ฐœ, ์•„๋ž˜ ๋ช‡๊ฐœ ๋“ค์–ด์žˆ๋Š”์ง€๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ? 0๊ฐœ์ผ ์ˆ˜๋Š” ์—†๊ณ , 1๊ฐœ๋ฉด Type1์ด ๋˜๊ณ , 2๊ฐœ ์ด์ƒ์ด๋ฉด ์›๋ž˜ ๊ฐ„์„ ์„ Type2๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  Type 1์„ ๋ถ™์ด๋Š” ๊ผด๋กœ ๋ ๊ฑฐ๊ฐ™์€๋”ฉ ๐Ÿ’ป ํ’€์ด # ์ฝ”๋“œ (C++): ll type1(int i, int j){ return dist(i, j) * (N + M - 1); } ll type2(int i, int j){ return dist(i, j) * (i + j + 1) * (N + M - i - j - 1); } void solve(){ cin >> N >> M >> L; rep(i, 0, N) cin >> U[i]; rep(i, 0, M) cin >> D[i]; rep(i, 0, N) rep(j, 0, M) rep(k, 0, 2) rep(l, 0, 2) DP[i][j][k][l] = 1e18; DP[0][0][0][0] = type2(0, 0); rep(i, 0, N) rep(j, 0, M) rep(k, 0, 2) rep(l, 0, 2){ // ์•„๋ž˜ ํ—›๊ฐ„์— ์ƒˆ๋กœ์šด ์œ„ ํ—›๊ฐ„ ๋ถ™์ด๊ธฐ ll &cur = DP[i][j][k][l]; if(i+1 < N){ ll &ret = DP[i+1][j][0][1]; if(l == 0) ret = min(ret, cur + type2(i+1, j)); else ret = min(ret, cur - type2(i, j) + type1(i, j) + type2(i+1, j)); } // ์œ„ ํ—›๊ฐ„์— ์ƒˆ๋กœ์šด ์•„๋ž˜ ํ—›๊ฐ„ ๋ถ™์ด๊ธฐ if(j+1 < M){ ll &ret = DP[i][j+1][1][0]; if(k == 0) ret = min(ret, cur + type2(i, j+1)); else ret = min(ret, cur - type2(i, j) + type1(i, j) + type2(i, j+1)); } } ll ans = 1e18; rep(k, 0, 2) rep(l, 0, 2) ans = min(ans, DP[N-1][M-1][k][l]); cout << ans << '\n'; } ๐Ÿ”’ ๊ตฌํ˜„ ์ฝ”๋“œ ์ž ๊ธˆ

BOJ 17790 Inquiry II

·445 words·3 mins
๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด # ๋งํฌ: https://www.acmicpc.net/problem/17790 ๋ฒˆ์—ญ ๋ฌธ์ œ # ๋ฌด๋ฐฉํ–ฅ ๋‹จ์ˆœ ๊ทธ๋ž˜ํ”„ G = (V, E)์— ๋Œ€ํ•ด, V’ โІ V์ธ ๋ถ€๋ถ„์ง‘ํ•ฉ V’๋ฅผ ๋…๋ฆฝ ์ง‘ํ•ฉ(independent set)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์€ V’์˜ ์–ด๋–ค ๋‘ ์›์†Œ๋„ ๊ฐ„์„ ์œผ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์„ ๋•Œ์ž…๋‹ˆ๋‹ค. G์˜ ๋…๋ฆฝ ์ง‘ํ•ฉ์„ ์ตœ๋Œ€ ๋…๋ฆฝ ์ง‘ํ•ฉ(maximum independent set)์ด๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์€ G์— ๊ทธ๋ณด๋‹ค ์—„๊ฒฉํ•˜๊ฒŒ ๋” ๋งŽ์€ ์ •์ ์„ ๊ฐ€์ง„ ๋…๋ฆฝ ์ง‘ํ•ฉ์ด ์—†์„ ๋•Œ์ž…๋‹ˆ๋‹ค. ํŠน์ •ํ•œ ์ข…๋ฅ˜์˜ ์—ฐ๊ฒฐ๋œ ๊ทธ๋ž˜ํ”„ G๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, G์˜ ์ตœ๋Œ€ ๋…๋ฆฝ ์ง‘ํ•ฉ์˜ ํฌ๊ธฐ๋ฅผ ๊ตฌํ•˜์„ธ์š”.