1890

백준 1890번

Link: 1890번: 점프


문제 설명

오늘도 DP문제.

옆에서 친구가 풀던거 같이 한번 풀어봤는데, 조금 고전했다.

처음에는 BFS로 풀어보려고 했는데 문제 자체가 BFS로 풀기에는 조건이 적당하지 않아서 무한루프로 끝났다.

다른 방법으로 풀 수 있는지 찾아보던 중 어떻게든 규칙을 찾아서 DP로 풀어야겠다는 생각을 했고, 고민끝에 규칙을 찾아 샘플 케이스를 돌려보니 맞았다.

구현하는데 인덱스가 헷갈려서 살짝 애먹긴 했지만 무난히 맞았다.


정답 코드

//
// Created by Keith_Lee on 26/02/2019.
//

#include <iostream>

using namespace std;

int N;

int map[101][101] = {-1, };
long long DP[101][101] = {0, };

int main(){
    cin >> N;

    for(int i=1; i<=N; i++){
        for(int j=1; j<=N; j++){
            cin >> map[i][j];
        }
    }

    DP[1][1] = 1;

    for(int i=1; i<=N; i++){
        for(int j=1; j<=N; j++){
            if(i == j && i == 0){
                continue;
            }

            for(int k=0; k<j; k++){
                if(k + map[i][k] == j){
                    DP[i][j] += DP[i][k];
                }
            }

            for(int k=0; k<i; k++){
                if(k + map[k][j] == i){
                    DP[i][j] += DP[k][j];
                }
            }
        }
    }

//    for(int i=1; i<=N; i++){
//        for(int j=1; j<=N; j++){
//            cout << DP[i][j] << ' ';
//        }
//        cout << '\n';
//    }

    cout << DP[N][N] << '\n';
}

Tags:

Categories:

Updated: