-๋์ ๊ณํ๋ฒ (dynamic programming)
๋ณต์กํ ๋ฌธ์ ๋ฅผ ๊ฐ๋จํ ์ฌ๋ฌ๊ฐ์ ๋ฌธ์ ๋ก ๋๋์ด์ ํธ๋ ๋ฐฉ๋ฒ.
๋ถ๋ถ๋ฌธ์ ๋ฐ๋ณต๊ณผ ์ต์ ๋ถ๋ถ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ ์๊ณ ๋ฆฌ์ฆ์ ์ผ๋ฐ์ ์ธ ๋ฐฉ๋ฒ๋ณด๋ค ๋ ์ ์ ์๊ฐ๋ด์ ํ ๋ ์ฌ์ฉ.
๋ฌธ์ ๋ฅผ ์ฌ๋ฌ๊ฐ์ ํ์ ๋ฌธ์ (subproblem)๋ก ๋๋์ด ํ.
์ด ํ์๋ฌธ์ ๋ค์ ๊ฒฐํฉํ์ฌ ์ต์ข ์ ์ธ ๋ฌธ์ ์ ๋๋ฌํ๋ ๊ฒ.
๋ฉ๋ชจ์ด์ ์ด์ (memoization)
์ปดํจํฐ ํ๋ก๊ทธ๋จ์ด ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณตํ ๋, ์ด์ ์ ๊ณ์ฐํ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํด์ ๋์ผํ ๊ณ์ฐ์ ๋ฐ๋ณต ์ํ์ ์ ๊ฑฐํ์ฌ ํ๋ก๊ทธ๋จ ์คํ ์๋๋ฅผ ๋น ๋ฅด๊ฒ ํ๋ ๊ธฐ์ .
๋์ ๊ณํ๋ฒ์ ํต์ฌ ๊ธฐ์ .
์ฒ์ ๋ฐฉ๋ฌธํ๋ ์ฌ๊ท๋ฌธ์ ๋ฉด ๊ณ์ฐ์ ํตํด ์ป์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ,
์ด ํ ์ฌ๋ฐฉ๋ฌธ์ ํ๋ฉด ๊ณ์ฐํ์ง ์๊ณ ์ ์ฅ ๋ ๊ฐ ์ฌ์ฉ.
ex)
import java.util.Scanner;
public class Main {
static int array[][][] = new int[51][51][51];
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int a=0, b=0, c=0;
while(true){
a = scan.nextInt();
b = scan.nextInt();
c = scan.nextInt();
if(a==-1 && b==-1 && c==-1) break;
System.out.printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));
}
}
static int w(int a, int b, int c) {
if(a<=0 || b<=0 || c<=0)
return 1;
else if(array[a][b][c] != 0)
return array[a][b][c];
else if(a>20 || b>20 || c>20)
return array[a][b][c] = w(20,20,20);
else if(a<b && b<c)
return array[a][b][c] = w(a,b, c-1) + w(a, b-1, c-1) - w(a, b-1, c);
else
return array[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1);
}
}
์ด์ ์ ๊ณ์ฐํ ๊ฐ๋ค์ ๋ฐฐ์ด์๋ค ์ ์ฅ์ํค๊ณ , ์ด์ ์ ๊ณ์ฐํ๊ฐ์ด ์์ผ๋ฉด ๊ณ์ฐ์ ํ์ง์๊ณ ๋ฐ๋ก ์ ์ฅ๋ ๊ฐ์ returnํ์ฌ ํ๋ก๊ทธ๋จ ์๋ ๊ฐ์ ์ ํ ์ ์์.