Skip to main content
  1. Posts/
  2. Today I Learned/

SOS Dynamic Programming

·392 words·2 mins
Jiho Kim
Author
Jiho Kim
๋‹ฌ๋ ค ๋˜ ๋‹ฌ๋ ค

๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ
#

  • $2^N$๊ฐœ์˜ ์ •์ˆ˜ ๋ฐฐ์—ด $A$๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ $\forall x$ ์— ๋Œ€ํ•ด $F(x)$๋ฅผ $\sum\limits_{i \subseteq x}{A[i]}$ ๋ผ๊ณ  ์ •์˜ํ•˜์ž. ์ด๋Š” $x\&i = i$ ์ธ $i$๋“ค์— ๋Œ€ํ•ด $A[i]$์˜ ํ•ฉ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์œ„์™€ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ’€ ์ˆ˜์žˆ์„๊นŒ?

๋ธŒ๋ฃจํŠธํฌ์Šค
#

  • ๋А๋ฆฌ์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.
    for(int mask = 0; mask < (1<<N); mask++){
    	for(int i = 0; i < (1<<N); i++){
    		if((mask&i) == i){
    			F[mask] += A[i];
    		}
    	}
    }
  • ์œ„ ์‹์„ ๊ทธ๋Œ€๋กœ ์˜ฎ๊ธด ๊ฒƒ์— ๊ฐ€๊น๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ${(2^N)}^2 = 4^N$์ด๋‹ค.

์กฐ๊ธˆ ๋” ๋‚˜์€ ํ’€์ด
#

  • ๋‘๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์— ๋Œ€ํ•ด, ๋ฐ”๊นฅ์ชฝ ๋ฐ˜๋ณต๋ฌธ์—์„œ ์ผœ์ง€์ง€ ์•Š์€ ๋น„ํŠธ์— ๋Œ€ํ•ด์„œ๋„ ๋ฐ˜๋ณต์„ ๋„๋Š”๊ฒƒ์€ ๋„ˆ๋ฌด ์•„๊น๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด๋„ ํ•œ๋ฒˆ ์‹œ๋„ํ•ด๋ณผ ์ˆ˜ ์žˆ๊ฒ ๋‹ค.
    for(int mask = 0; mask < (1<<N); mask++){
    	F[mask] = A[0];
    	for(int i = 0; i < (1<<N); i = (i-1)&mask) F[mask] += A[i];
    }
  • ์‹œ๊ฐ„๋ณต์žก๋„ ์ฆ๋ช…์ด ์–ด๋ ค์›Œ๋ณด์ธ๋‹ค.
  • ์ด๋Š” $\sum\limits_{k = 0}^N{\binom{N}{K}2^K} = 3^N$ ์ด๋ผ๊ณ  ํ•œ๋‹ค.

Sum over Subsets DP
#

  • ์œ„์˜ ๋ฐฉ์‹์—์„œ ๋ณ‘๋ชฉ์€ ์–ด๋””์—์„œ ๋‚˜ํƒ€๋‚ ๊นŒ?
  • ์–ด๋–ค $x$์˜ ๋น„ํŠธ๊ฐ€ $K$๊ฐœ๊ฐ€ ๊บผ์ ธ์žˆ์„ ๋•Œ, $A[x]$๋Š” $2^K$๊ฐœ์˜ ๋งˆ์Šคํฌ์— ์˜ํ•ด ๋ฐฉ๋ฌธ๋œ๋‹ค.
    • ์ด ๋ฐ˜๋ณต์ ์ธ ์žฌ๊ณ„์‚ฐ์„ ์ค„์—ฌ์•ผํ•œ๋‹ค.

S(mask, i) ์ •์˜
#

  • ์œ„ ๋ณ‘๋ชฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ํ•˜๋‚˜ ์ •์˜ํ•ด๋ณด์ž.
  • $S(mask, i)$๋Š” $mask$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ๋“ค ์ค‘, $mask$์™€ ํ•˜์œ„(์˜ค๋ฅธ์ชฝ) $i$๊ฐœ ๋น„ํŠธ(0~i-1๋ฒˆ ์ธ๋ฑ์Šค)์—์„œ๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, $S(110, 2) = \{100, 110\}$์ด๋‹ค. ์˜ค๋ฅธ์ชฝ ๋‘๊ฐœ ๋น„ํŠธ์—์„œ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ๋ถ€๋ถ„์ง‘ํ•ฉ์ด์–ด์•ผ ํ•˜๋ฏ€๋กœ $111$๊ฐ™์€๊ฑด ์•ˆ๋œ๋‹ค.
  • ์ด ์ •์˜๋ฅผ ์ด์šฉํ•˜๋ฉด, ์–ด๋–ค ์ง‘ํ•ฉ๋„ ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๋Š” $S(mask, i)$๋“ค์˜ ํ•ฉ์ง‘ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

์ ํ™”์‹ ์œ ๋„
#

  • ์ ํ™”์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‘๊ฐ€์ง€๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.
  • $mask$์˜ $i$๋ฒˆ์งธ ๋น„ํŠธ๊ฐ€ $0$์ธ ๊ฒฝ์šฐ
    • $mask$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด $i$๋ฒˆ์งธ ๋น„ํŠธ์—์„œ $0$๋งŒ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
    • $S(mask, i) = S(mask, i-1)$
  • $mask$์˜ $i$๋ฒˆ์งธ ๋น„ํŠธ๊ฐ€ $1$์ธ ๊ฒฝ์šฐ
    • $mask$์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์ด $i$๋ฒˆ์งธ ๋น„ํŠธ์—์„œ $0, 1$ ๋ชจ๋‘ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ
    • $S(mask, i) = S(mask, i-1) \cup S(mask \oplus 2^i, i-1)$
  • ๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    for(int mask = 0; mask < (1<<N); mask++) DP[mask] = A[mask];
    
    for(int i = 0; i<N; i++){
    	for(int mask = 0; mask < (1<<N); mask++){
    		if(mask & (1<<i)) DP[mask] += DP[mask ^ (1<<i)];
    	}
    }
  • ๊ณ„์‚ฐ ๊ฒฐ๊ณผ DP์— ๋“ค์–ด์žˆ๋Š” ๊ฐ’์€ ํ•ด๋‹น ๋น„ํŠธ๋งˆ์Šคํ‚น์˜ ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ํ•ฉ์ด๋‹ค.
  • ์‹œ๊ฐ„๋ณต์žก๋„๋Š” ๊ทธ๋Œ€๋กœ ๋ณด์ด๋“ฏ์ด $O(N2^N)$์ด๋‹ค.

N์ฐจ์› ๋ˆ„์ ํ•ฉ
#

  • https://blog.queuedlab.com/posts/sos-dp ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด, ์ด๋ฅผ $N$์ฐจ์› ๋ˆ„์ ํ•ฉ์œผ๋กœ๋„ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜์ดํผ ์ˆ˜์—ด๊ณผ ํ•˜์ดํผ ์ฟผ๋ฆฌ ๋ฌธ์ œ์—์„œ $N$์ฐจ์› ๋ˆ„์ ํ•ฉ ์•„์ด๋””์–ด๋Š” ์จ๋ณธ์ ์ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด๊ฒƒ์ด SOS DP์™€ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ด ์‹ ๊ธฐํ•˜๋‹ค.
  • ์•ž์œผ๋กœ๋Š” ํฌํ•จ๋ฐฐ์ œ์—์„œ ๋ญ”๊ฐ€ ์ค„์ด๊ณ ์‹ถ์œผ๋ฉด ํ•œ๋ฒˆ์”ฉ์€ ์˜์‹ฌํ•ด๋ณด๋Š”๊ฑธ๋กœ?

imos-hanbyul Trick
#

  • ์ด์™€ ๋น„์Šทํ•œ ๋‚ด์šฉ์„ https://qwerasdfzxcl.tistory.com/35 ์—ฌ๊ธฐ์„œ ๋ณธ์ ์ด ์žˆ๋‹ค.
  • ์ง€๊ธˆ ๋‹น์žฅ์€ ์ดํ•ดํ•˜๊ธฐ ๊ท€์ฐฎ์œผ๋ฏ€๋กœ ์ดํ•ดํ•œ ๋‚ด์šฉ์€ ๋‚˜์ค‘์— ์ถ”๊ฐ€ํ•˜๊ฒ ๋‹ค.

โ”์งˆ๋ฌธ ์‚ฌํ•ญ
#

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ
#