백준 1890번 문제 보기

문제풀이

2차원 배열에서의 DP문제이므로

  • DP를 위한 배열을 따로 만들고
  • 해당 DP 배열을 채워나가는 식으로 풀면 된다.

1520번과 비슷하지만 좀 더 쉽게 풀 수 있는 문제인 것 같다.

Bottom-up 방식으로 풀기

board의 (x, y) 번째 칸으로는 (x, y)의 왼쪽, 위쪽으로 만들어지는 직사각형에 속해있는 칸에서만 올 수 있다.
따라서 (0,0)부터 오른쪽 방향으로 한 칸씩 이동하면서, (그 후 그 다음 행에서 오른쪽 방향으로 이동하면서) 점프를 해서 갈 수 있는 곳에 횟수를 더해주면서 dp 배열을 만들면 된다.


Code

#include <iostream>
using namespace std;

int N;
int board[100][100];
long long dp[100][100];

int main(){
    dp[0][0]=1;
    cin >> N;
    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++) cin >> board[i][j];
    }

    for(int i=0; i<N; i++){
        for(int j=0; j<N; j++){
            if(dp[i][j]!=0){
                if(board[i][j]==0) continue;
                if(j+board[i][j]<N){
                    dp[i][j+board[i][j]]+=dp[i][j];
                }
                if(i+board[i][j]<N){
                    dp[i+board[i][j]][j]+=dp[i][j];
                }
            }
        }
    }
    cout << dp[N-1][N-1];
    return 0;
}

'알고리즘' 카테고리의 다른 글

[프로그래머스] N으로 표현  (2) 2020.03.27
[백준] 11048번 - 이동하기  (0) 2019.12.19
[백준] 1520번 - 내리막길  (0) 2019.12.19
[백준] 10844번 - 쉬운계단수  (0) 2019.12.19
[백준] 12100번 - 2048(Easy)  (0) 2019.12.10
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • shared트위터 공유하기
  • shared
  • 카카오스토리 공유하기