[백준] 1520번 내리막 길 (C++)

2025. 12. 24. 21:43·Algorithm
728x90

https://www.acmicpc.net/problem/1520

 

 

이 문제는 N X M 행렬이 주어지고 각각의 요소가 주어질때 (1, 1)에서 시작하여 (N,M)까지 도달할 수 있는 경우의 수를 출력해야한다.

 

이때 한가지 조건은 현재 칸에서 다음 칸으로 갈때 작은 값으로 줄어들어야 한다.

 

이때 단순 재귀를 사용하여 경우의 수를 찾는 경우 O(2^NM)으로 지수승으로 값이 엄청나게 커진다.

 

따라서 이를 최적화할 수 있게 O(NM)으로 해결해야 한다.

따라서 dfs(깊이 우선 탐색) + dp(메모이제이션)을 사용하여 최적화하였다.

 

 

정답코드

 

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"

const int INF = 1e9;
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
int N, M;
int graph[501][501];
int dp[501][501];
int answer;

int func(int x, int y) {
    int &ret = dp[x][y];

    if(x == N-1 && y == M-1) {
        return 1;
    }

    if(ret != -1) return ret;

    ret = 0;

    for(int i = 0; i < 4; i++) {
        int nx = x + dx[i];
        int ny = y + dy[i];

        if(nx < 0 || nx >= N || ny < 0 || ny >= M) continue;

        if(graph[nx][ny] < graph[x][y]) {
            ret += func(nx, ny);
        }
    }

    return ret;
}

void solve() {
    cout << func(0, 0);
}

void input() {
    cin >> N >> M;

    for(int i = 0; i < N; i++) {
        for(int j = 0; j < M; j++) {
            cin >> graph[i][j];

            dp[i][j] = -1;
        }
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

 

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 14722번 우유 도시 (C++)  (0) 2025.12.26
[백준] 18513번 샘터 (C++)  (0) 2025.12.25
[백준] 14595번 동방 프로젝트 (Large) (C++)  (0) 2025.12.23
[백준] 14925번 목장 건설하기 (C++)  (0) 2025.12.22
[백준] 20303번 할로윈의 양아치 (C++)  (0) 2025.12.21
'Algorithm' 카테고리의 다른 글
  • [백준] 14722번 우유 도시 (C++)
  • [백준] 18513번 샘터 (C++)
  • [백준] 14595번 동방 프로젝트 (Large) (C++)
  • [백준] 14925번 목장 건설하기 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (279) N
      • Programming (47)
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (3)
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (1)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6) N
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    우선순위 큐
    깊이우선탐색
    시뮬레이션
    재귀
    Leviathan
    다이나믹 프로그래밍
    wargame
    에라토스테네스의 체
    트리
    브루트포스
    DP
    그리디
    그래프 이론
    투포인터
    WebSecurity
    BFS
    비트마스킹
    linux
    정렬
    우선순위큐
    누적합
    c언어
    이분탐색
    코딩
    DFS
    다익스트라
    백트래킹
    구현
    백준
    Bandit
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 1520번 내리막 길 (C++)
상단으로

티스토리툴바