[λ°±μ€] 1937 μμ¬μμ΄ νλ€ πΌ DP
λ¬Έμ :
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;
}