728x90
반응형
문제 출처 :
www.algospot.com/judge/problem/read/ASYMTILING
algospot.com :: ASYMTILING
비대칭 타일링 문제 정보 문제 그림과 같이 2 * n 크기의 직사각형을 2 * 1 크기의 타일로 채우려고 합니다. 타일들은 서로 겹쳐서는 안 되고, 90도로 회전해서 쓸 수 있습니다. 단 이 타일링 방법은
www.algospot.com
문제 풀이 :
[종만북] 타일링(TILING2) (Python)
문제 출처: www.algospot.com/judge/problem/read/TILING2 algospot.com :: TILING2 타일링 문제 정보 문제 2xn 크기의 사각형을 2x1 크기의 사각형으로 빈틈없이 채우는 경우의 수를 구하는 프로그램을 작성하세..
jinu0418.tistory.com
- 위의 문제에서 조금 더 나아간 문제이다.
- 간단하게 양옆이 대칭인 부분에 대해서 빼면 된다. 때문에 위에서 구한 전체 경우의 수에서 대칭인 경우만 빼주면 된다.
- 대칭인 부분은 다음 그림과 같이 3가지로 나눠진다.
- 때문에 타일링 문제에서 사용한 solve 함수에 대칭을 이루는 타일 종류를 빼는 symm함수를 구현하여 문제를 해결하였다.
- 이때 초기값 dp[2]에 대해서 문제가 있었는데 이경우는 예외처리를 통해서 해결하였다.
dp = [-1]*101
mod = 1000000007
c = int(input())
def init_():
global dp
dp = [-1]*101
dp[0]=0
dp[1]=1
dp[2]=2
dp[3]=3
dp[4]=5
def solve(N):
global dp
if(dp[N]!=-1):
return dp[N]%mod
dp[N] = (solve(N-1)%mod+solve(N-2)%mod)%mod
return dp[N]
def symm(N):
global dp
ret = solve(N)
if((N-1)%2==0):
ret = (ret- solve((N-1)//2) +mod )%mod
if((N-2)%2==0):
ret = (ret - solve((N-2)//2) + mod)%mod
if(N%2==0):
ret = (ret - solve(N//2) +mod)%mod
return ret
for _ in range(c):
init_()
n = int(input())
if(n==2):
print(0)
else:
print(symm(n))
반응형
'Computer Science > Algorithm' 카테고리의 다른 글
[백준] 1463 - 1로 만들기 (C++) (0) | 2021.01.13 |
---|---|
[백준] 10844 - 쉬운 계단 수 (Python) (0) | 2021.01.13 |
[종만북] 원주율 외우기(PI) (C++) (0) | 2021.01.13 |
[종만북] 타일링(TILING2) (Python) (0) | 2021.01.13 |
[백준] 1992- 쿼드트리 (Python) (0) | 2021.01.03 |