문제 링크
- https://icpc.me/27469
사용 알고리즘
- DP
시간복잡도
- $O(KNM)$
풀이
$k$번 이동했고 마지막에 $d$방향으로 움직였을 때 $(i, j)$에 도달하는 경우의 수를 $D(k, d, i, j)$라고 정의합시다. 상태 공간 $8KNM$개, 상태 전이는 매번 약 $O(2(N+M))$개라서 너무 오래 걸립니다.
하지만 $D(k, d, i, j)$를 구하기 위해 필요한 이전 상태를 생각해 보면, 2차원 배열 $D(k-1, \ast)$에서 가로로 연속한 몇 개의 칸, 세로로 연속한 몇 개의 칸, 대각선으로 연속한 몇 개의 칸만 필요하다는 것을 알 수 있습니다. 따라서 4방향에 대해 누적 합 배열을 만들면 상태 전이의 개수를 7~8번 정도로 줄일 수 있습니다.
전체 시간 복잡도는 $O(KNM)$이고, 상수가 60 정도 붙습니다.
전체 코드
1 |
|