https://www.acmicpc.net/problem/1890
이 문제는 어렵지 않았습니다.
dp라고 알 수 있는 부분은 이 문제가 경우의 수이고, 정답이 2^63이라면 DP를 제외하고는 시간안에 풀 수 없습니다.
dp라는 것만 안다면 어렵지 않은 문제입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | #include <iostream> using namespace std; typedef long long ll; int dx[] = { 1, 0 }; int dy[] = { 0, 1 }; int map[100][100]; ll dp[100][100]; int n; ll f(int x, int y) { if (x == n - 1 && y == n - 1) { return 1; } ll &ret = dp[x][y]; if (ret != -1) return ret; ret = 0; for (int i = 0; i < 2; i++) { int nx = x + dx[i] * map[x][y]; int ny = y + dy[i] * map[x][y]; if (nx >= n || ny >= n) continue; ret += f(nx, ny); } return ret; } int main() { cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> map[i][j]; dp[i][j] = -1; } } cout << f(0, 0); return 0; } | cs |
'알고리즘 > 다이나믹 프로그래밍(DP)' 카테고리의 다른 글
[1365] 꼬인 전깃줄 (0) | 2017.09.16 |
---|---|
[2565] 전깃줄 (0) | 2017.09.07 |
[2688] 줄어들지 않아 (0) | 2017.07.27 |
[12026] BOJ 거리 (0) | 2017.07.24 |
[1563] 개근상 (0) | 2017.07.24 |