-
[문제해결을 위한 창의적 알고리즘] 타일 채우기 (고급, p35)알고리즘 2016. 9. 16. 19:13
이 문제에서 익혀야 할 핵심은 점화식을 만들때, n번째 항과 n-1번째 항과의 관계식을 구하는 것이 아니라, n번째 항과 n/2번째 항과의 관계를 구하는 방법이다. 이를 통해 굉장히 효율적인 점화식을 만들 수 있기 때문이다. 특히 n이 홀수일 때와 n이 짝수일 때를 점화식을 유도하는 방법을 잘 익히는 것이 필요해 보인다.
import java.util.Scanner;
public class FillTilesSol45 {
public static int n;
public static int m;
public static long f(int k) {
if (k<=1)
return 1%m;
// k가 홀수일
else if (k%2>0)
return (f(k/2)*f(k/2+1)+2*f(k/2)*f(k/2-1))%m;
// k가 짝수일 때
else
return (f(k/2)*f(k/2)+2*f(k/2-1)*f(k/2-1))%m;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
sc.close();
System.out.println(f(n));
return;
}
}
Big O(log n) (n은 타일 길이)
'알고리즘' 카테고리의 다른 글
[문제해결을 위한 창의적 알고리즘] 영역 구분 (고급 p.51) (0) 2016.11.24 [문제해결을 위한 창의적 알고리즘] Distance of Nodes (고급, p47) (0) 2016.09.16 [문제해결을 위한 창의적 알고리즘] Combination (고급, p29) (0) 2016.09.16 [문제해결을 위한 창의적 알고리즘] 별 그리기 (고급, p24) (0) 2016.09.15 [문제해결을 위한 창의적 알고리즘] 색상환 (고급, p131) (0) 2016.08.15