๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 1937 ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค ๐Ÿผ DP

by Jouureee 2021. 5. 2.

๋ฌธ์ œ :

www.acmicpc.net/problem/1937

 

1937๋ฒˆ: ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค

n*n์˜ ํฌ๊ธฐ์˜ ๋Œ€๋‚˜๋ฌด ์ˆฒ์ด ์žˆ๋‹ค. ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค๋Š” ์–ด๋–ค ์ง€์—ญ์—์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณณ์˜ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋‹ค ๋จน์–ด ์น˜์šฐ๋ฉด ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์ค‘ ํ•œ ๊ณณ์œผ๋กœ ์ด๋™์„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ ๊ทธ๊ณณ์—์„œ

www.acmicpc.net

 

๋ถ„์„ :

n x n ํŒ๋‹ค ์ง‘์ด ์žˆ์œผ๋ฉด ํŒ๋‹ค๋Š” ์ƒํ•˜ ์ขŒ์šฐ๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ณ  ํ˜„ ์œ„์น˜์—์„œ ๋‹ค์Œ ๋‚ ์ด ๋ ๋•Œ ์ด๋™ํ•˜๋Š”๋ฐ ์ด๋™ํ•˜๋Š” ์นธ์— ๋จน์ด๊ฐ€ ๋” ๋งŽ์•„์•ผ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ์š•์‹ฌ์Ÿ์ด ์นœ๊ตฌ๋‹ค. ๊ทธ๋ž˜์„œ ์ตœ๋Œ€๋กœ ์‚ด ์ˆ˜ (?) ์žˆ๊ฒŒ ํ•˜๋Š” ๋‚ ์„ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

 

arr๋ฐฐ์—ด์— ๋ฐฅ์„ ๋„ฃ์–ด์ฃผ๊ณ  dp๋ฅผ ๋™์‹œ์— 0์œผ๋กœ ์ดˆ๊ธฐํ™” ์‹œ์ผœ์ค€ ๋’ค

dp ํ•จ์ˆ˜๋ฅผ ๋Œ๋ฉด์„œ ์ตœ๋Œ€๋กœ ์‚ด ์ˆ˜ ์žˆ๋Š” maxRice (maxLife ๋ณ€์ˆ˜๊ฐ€ ๋” ์ ์ ˆํ• ๋“ฏ)๋ฅผ ๊ฐฑ์‹  ์‹œ์ผœ์ค€๋‹ค. 

 

find_max_life ํ•จ์ˆ˜ ๋‚ด์—์„œ๋Š” ์šฐ์„  ํ•˜๋ฃจ๋Š” ์‚ด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„ ์œ„์น˜์— 1์„ ๋„ฃ์–ด์ฃผ๊ณ  ์ƒํ•˜์ขŒ์šฐ๋ฅผ ํƒ์ƒ‰ํ•˜๋ฉด์„œ 

๋‹ค์Œ ์œ„์น˜์˜ ๋จน์„ ๊ฒƒ์ด ํ˜„ ์œ„์น˜๋ณด๋‹ค ๋งŽ์€์ง€, ๋ฐฐ์—ด ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜์ง„ ์•Š์€์ง€ check ํ•œ๋‹ค

๊ทธ๋ฆฌ๊ณ  dp ์ž๋ฆฌ์— ๋‹ค์Œ ์œ„์น˜๋กœ ์›€์ง์˜€์„๋•Œ ๋˜ ์‚ด ์ˆ˜ ์žˆ๋‹ค๋ฉด +1์”ฉ ๋”ํ•œ ์žฌ๊ท€๋ฅผ ํ˜ธ์ถœํ•ด ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚จ ๋’ค ์›€์ง์ž„์ด ๋๋‚˜ ์žฌ๊ท€๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด for๋ฌธ๋„ ์ข…๋ฃŒ๋˜๊ณ  ๊ทธ ์ž๋ฆฌ์˜ ์›€์ง์ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

c++ ์ฝ”๋“œ :

//
//  1937_selfishPanda.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/04/30.
//

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>

using namespace std;
int arr[501][501];
int N;
int dp[501][501];

int dx[] = { 0, 0, 1, -1 }; //up down left right
int dy[] = { 1, -1, 0, 0 };

int find_max_life(int i, int j){
    if(dp[i][j] > 0){
        return dp[i][j];
    }
    
    dp[i][j] = 1;
    for(int k = 0; k < 4; k++){
        int nextX = i + dx[k];
        int nextY = j + dy[k];
        //์˜ˆ์™ธ์ฒ˜๋ฆฌ
        if(nextX < 0 || nextY < 0 || nextX >= N || nextY >= N) continue;
        if(arr[i][j] >= arr[nextX][nextY]) continue;
        //๊ธฐ์กด ๊ฐ’๊ณผ ๋‹ค์Œ ๋จน์ด ์ฐพ์œผ๋Ÿฌ ์›€์ง์˜€์„๋•Œ ์ค‘์˜ ์ตœ๋Œ€๊ฐ’
        dp[i][j] = max(dp[i][j], find_max_life(nextX, nextY) + 1);
    }
    
    return dp[i][j];
}

int main(){
    cin >> N;
    
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
            cin >> arr[i][j];
            dp[i][j] = 0;
        }
    }
    
//input ํ™•์ธ์šฉ
//    for(int i = 0; i < N; i++){
//        for(int j = 0; j < N; j++){
//            cout << arr[i][j] << " ";
//        }
//        cout << '\n';
//    }
    
    int maxRice = 0;
    
    for(int i = 0; i < N; i++){
        for(int j = 0; j < N; j++){
           maxRice = max(maxRice, find_max_life(i, j));
        }
        cout << '\n';
    }
    
    cout << maxRice <<'\n';
    
  
    return 0;
}

๋Œ“๊ธ€