Algorithm🐰/λ°±μ€€

[λ°±μ€€] 1937 μš•μ‹¬μŸμ΄ νŒλ‹€ 🐼 DP

Jouureee 2021. 5. 2. 03:52

문제 :

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;
}