반응형

문제출처

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


문제풀이

/**
* 왜 정렬문제인지 모르겠다.
* dp로 풀이 했으며 전체탐색으로는 시간초과가 난다.
* dp[y][x]는 y에서 x로 올 수 있는 최대값이다.
* 풀이 방법이 dp인 것만 알면 쉽게 풀 수 있었다.
* dp배열을 -1로 초기화 해주고 초기값이 아니라면 return으로 빠져나온다.
* 이후 상하좌우방향에서 dfs를 통해 리턴값+1(하루더 살기때문)과 dp[y][x](현재까지의 최대값)중 큰것을 dp[y][x]에 넣는다.
*/


소스코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <algorithm>
#include <cstring>
#define MAX 500
 
using namespace std;
 
int n, ans;
int map[MAX][MAX], dp[MAX][MAX];
int dx[]={0,0,-1,1};
int dy[]={-1,1,0,0};
 
int dfs(int y, int x) {
    if(dp[y][x]!=-1return dp[y][x];
    dp[y][x]=1;
    for(int i=0; i<4; i++) {
        int nx=x+dx[i];
        int ny=y+dy[i];
        if(nx<0 || nx>=|| ny<0 || ny>=|| map[y][x]>=map[ny][nx]) continue;
        dp[y][x]=max(dp[y][x], dfs(ny,nx)+1);
    }
    return dp[y][x];
}
 
int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    cin>>n;
    memset(dp, -1sizeof(dp));
    for(int y=0; y<n; y++)
        for(int x=0; x<n; x++)
            cin>>map[y][x];
    for(int y=0; y<n; y++)
        for(int x=0; x<n; x++)
            ans=max(dfs(y,x), ans);
    cout<<ans;
    return 0;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 1213] 펠린드롬 만들기  (0) 2019.02.19
[BOJ 1431] 시리얼 번호  (0) 2019.02.18
[BOJ 10989] 수정렬하기3  (0) 2019.02.15
[BOJ 10814] 나이순 정렬  (0) 2019.02.13
[BOJ 1026] 보물  (0) 2019.02.12

+ Recent posts