ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 17265번 - 나의 인생에는 수학과 함께
    알고리즘/백준 2024. 8. 17. 01:13

     

    N이 3 또는 5인 경우밖에 없는 문제라 다양한 방법으로 풀이가능할 것 같다.

    요즘에 DP익숙해지려고 하는 중이라, DP로 풀었다. 그래도 풀다보니 익숙한 애들은 풀만한듯

    그리고 여러모로 바빠서, 그냥 매일매일 랜덤 골드 적당히 푸는 중

     

    문제

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

    DP, 근데 다 돌려도 상관 없을 듯, 또는 깡구현으로 풀어도 될듯

     

    코드

    #include <iostream>
    #include <queue>
    #include <vector>
    #include <cmath>
    #include <algorithm>
    #include <map>
    #include <unordered_map>
    using namespace std;
    int N;
    char arr[5][5];
    int dp[5][5];
    int dp2[5][5];
    int dy[3] = { 0, -1 , -2 };
    int dx[3] = { -2, -1, 0 };
    int op(int a, char pp, int b)
    {
        if (pp == '+') {
            return a + b;
        }
        else if (pp == '*') {
            return a * b;
        }
        else if (pp == '-') {
            return a - b;
        }
    }
    int main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0);
        cout.tie(0);
        cin >> N;
        for (int i = 0; i < N; ++i)
        {
            for (int j = 0; j < N; ++j) {
                cin >> arr[i][j];
                dp[i][j] = -987654321;
                dp2[i][j] = 987654321;
            }
        }
    
        dp2[0][0] = dp[0][0] = arr[0][0] - '0';
        for (int i = 0; i < N; i++)
        {
            for (int j = 0; j < N; ++j)
            {
                if (arr[i][j] < '0' || arr[i][j] > '9') continue;
                int curr = arr[i][j] - '0';
    
                if (j - 2 >= 0) {
                    dp[i][j] = max(dp[i][j], op(dp[i][j - 2], arr[i][j - 1], curr));
                    dp2[i][j] = min(dp2[i][j], op(dp2[i][j - 2], arr[i][j - 1], curr));
                }
                if (i - 2 >= 0) {
                    dp[i][j] = max(dp[i][j], op(dp[i - 2][j], arr[i - 1][j], curr));
                    dp2[i][j] = min(dp2[i][j], op(dp2[i - 2][j], arr[i - 1][j], curr));
                }
                if (i - 1 >= 0 && j - 1 >= 0) {
                    dp[i][j] = max(dp[i][j], op(dp[i - 1][j - 1], arr[i - 1][j], curr));
                    dp[i][j] = max(dp[i][j], op(dp[i - 1][j - 1], arr[i][j - 1], curr));
                    dp2[i][j] = min(dp2[i][j], op(dp2[i - 1][j - 1], arr[i - 1][j], curr));
                    dp2[i][j] = min(dp2[i][j], op(dp2[i - 1][j - 1], arr[i][j - 1], curr));
                }
            }
        }
    
        //for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) cout << dp2[i][j] << ' '; cout << '\n'; }
        cout << dp[N - 1][N - 1] << ' ' << dp2[N - 1][N - 1];
        return 0;
    }

    '알고리즘 > 백준' 카테고리의 다른 글

    메모장.  (1) 2024.08.28
    [백준] 16975번 - 수열과 쿼리 21  (0) 2024.08.28
    [백준] 18133 - 가톨릭대학교에 워터 슬라이드를??  (2) 2024.08.03
    [백준] 1258 - 문제 할당  (0) 2024.07.27
    BFS/DFS 기본기 연습  (1) 2024.07.21
Designed by Tistory.