홍시홍의 프로그래밍

[백준 1937] 욕심쟁이 판다 본문

알고리즘 문제풀이/백준

[백준 1937] 욕심쟁이 판다

홍시홍 2020. 1. 9. 21:53

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

 

1937번: 욕심쟁이 판다

n*n의 크기의 대나무 숲이 있다. 욕심쟁이 판다는 어떤 지역에서 대나무를 먹기 시작한다. 그리고 그 곳의 대나무를 다 먹어 치우면 상, 하, 좌, 우 중 한 곳으로 이동을 한다. 그리고 또 그곳에서 대나무를 먹는다. 그런데 단 조건이 있다. 이 판다는 매우 욕심이 많아서 대나무를 먹고 자리를 옮기면 그 옮긴 지역에 그 전 지역보다 대나무가 많이 있어야 한다. 만약에 그런 지점이 없으면 이 판다는 불만을 가지고 단식 투쟁을 하다가 죽게 된다(-_-) 이

www.acmicpc.net

 

1/8일 풀었던 문제

요구사항

1. 판다가 제일 오래 살 수있는 경로 구하기

 

풀이

1. dp로 현재 좌표에서 부터 몇일을 살 수 있는지 미리 저장한다.

 

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

using namespace std;
 
struct NODE {
    int prev;
    int next;
    int val;
};
int n;
int map[501][501];
int dp[501][501];
int dr[4] ={-1,0,1,0};
int dc[4] ={0,-1,0,1};
int f(int r, int c){
    int &ret=dp[r][c];
    if(ret !=1){
        return ret;
    }
    for(int i=0 ; i < 4; i++){
        int nr = r+dr[i];
        int nc = c+dc[i];
        if(nr<0 || nc<0 || nr>=n || nc>=n)
            continue;
        if(map[nr][nc]>map[r][c]){
            ret = max(ret,f(nr,nc)+1);
        }   
    }
    return ret;
}
int main(){
    cin>>n;
    for(int i=0 ; i < n ; i++){
        for(int j=0 ; j <n ; j++){
            dp[i][j]=1;
            scanf("%d",&map[i][j]);
        }
    }
    int ans=0;
    for(int i=0 ; i < n ; i++){
        for(int j=0 ; j <n ; j++){
            ans=max(ans,f(i,j));
        }
    }
    cout<<ans<<endl;
}

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준 1753]최단 경로  (0) 2020.01.09
[백준 10825] 국영수  (0) 2020.01.09
[백준 11004] k번째 수  (0) 2020.01.09
[백준 11651]좌표 정렬하기2  (0) 2020.01.09
[백준 11650] 좌표 정렬하기  (0) 2020.01.09
Comments