-
[백준][1890번] 점프Algorithm/백준 2020. 3. 23. 23:15
https://www.acmicpc.net/problem/1890
1890번: 점프
문제 N×N 게임판에 수가 적혀져 있다. 이 게임의 목표는 가장 왼쪽 위 칸에서 가장 오른쪽 아래 칸으로 규칙에 맞게 점프를 해서 가는 것이다. 각 칸에 적혀있는 수는 현재 칸에서 갈 수 있는 거리를 의미한다. 반드시 오른쪽이나 아래쪽으로만 이동해야 한다. 0은 더 이상 진행을 막는 종착점이며, 항상 현재 칸에 적혀있는 수만큼 오른쪽이나 아래로 가야 한다. 한 번 점프를 할 때, 방향을 바꾸면 안 된다. 즉, 한 칸에서 오른쪽으로 점프를 하거나, 아래로
www.acmicpc.net
풀이과정
1. dp로 풀었다.
2. 현재 발판의 값을 v라고 했을 경우 아래와 같은 답을 구 할 수 있었다.
dp[y][x] = dp[y+v][x] + dp[y][x+v] 라는 점화식을 구할 수 있다.
dp[n][n]을 도착 할 경우 1을 반환해주면 중복처리 없이 답을 구 할 수 있었다.
*dp 공부전엔 bfs로 시간초과가 발생했던 문제였다..
소스코드
더보기#include<stdio.h> #include<string.h> typedef unsigned long long ull; int map[101][101]; ull dp[101][101]; int n; ull solution(int x, int y) { if (x == n - 1 && y == n - 1) return 1; if (dp[y][x] != -1) return dp[y][x]; int num = map[y][x]; dp[y][x] = 0; if (y + num < n) { dp[y][x] += solution(x, y + num); } if (x + num < n) { dp[y][x] += solution(x + num, y); } return dp[y][x]; } int main() { scanf("%d\n", &n); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { scanf("%d", &map[i][j]); } } memset(dp, -1, sizeof(dp)); solution(0, 0); printf("%llu\n", dp[0][0]); }
'Algorithm > 백준' 카테고리의 다른 글
[백준][11053번] 가장 긴 증가하는 부분 수열 (0) 2020.03.24 [백준][1309번] 동물원 (0) 2020.03.23 [백준][2156번] 포도주 시식 (0) 2020.03.22 [백준][11052번] 카드 구매하기 (0) 2020.03.22 [백준][11048] 이동하기 (0) 2020.03.22