★★★★★다시 풀어 볼 문제★★★★★
알고리즘 문제해결 전략 1권
외발 뛰기 (문제 ID: JUMPGAME, 난이도: 하)
나름 DP문제는 많이 풀어봤다고 생각했지만 , 이 문제처럼 TRUE FALSE로 답을 내는 문제는 처음이었다.
내가 푼 DP문제들은 경우의 수를 구하는 문제가 대부분이었다.
그러다 보니 약간 생소한 느낌이고, 다른 문제를 푸는 느낌이었다.
그래서 풀어보는데 이해가 안가고 고민해야 했던 부분이 많았다.
# 내가 지금까지 풀어온 DP는 뭔가 점화식을 정하고 풀어야 한다는 강박관념이 있었는데,
이 문제는 그냥 재귀함수로 원하는 칸에 도달할 때까지 풀면서, 메모이제이션만 하면 됐다.
물론 이 과정에서 점화식을 구하고 풀어도 되겠지만 딱히 점화식이라고 생각하지 않았다(개인적으로)
코드적 스킬은 마지막 check[x][y] 를 || 연산으로 묶어줘서 판별하는 방식을 배웠다!
코드
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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include<iostream> #include<string.h> using namespace std; int map[101][101]; int check[101][101]; int n; int jump(int x, int y) { if (x >= n || y >= n) { return 0; } if (x == n - 1 && y == n - 1) { return 1; } if (check[x][y] != -1) { return check[x][y]; } check[x][y] = (jump(x + map[x][y], y) || jump(x, y + map[x][y])); return check[x][y]; } int main() { //freopen("input.txt", "r", stdin); int tc; cin >> tc; for (int t = 1; t <= tc; t++) { memset(check, -1, sizeof(check)); memset(map, -1, sizeof(map)); cin >> n; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { cin >> map[i][j]; } } int c = jump(0, 0); if (c==1) { cout << "YES" << endl; } else { cout << "NO" << endl; } } return 0; } | cs |
반응형
'알고리즘 > Algospot' 카테고리의 다른 글
PICNIC (C언어) (0) | 2018.06.25 |
---|---|
28.2 문제: 고대어 사전(문제 ID: DICTIONARY) (0) | 2017.12.07 |
6.8 문제: 시계 맞추기 (문제 ID: CLOCKSYNC, 난이도: 중) (0) | 2017.11.09 |
6.5 문제: 게임판 덮기 (문제 ID: BOARDCOVER, 난이도: 하) (0) | 2017.11.09 |
6.3 문제 : 소풍 ( 문제 ID: PICNIC , 난이도: 하) (0) | 2017.11.09 |