π λ§ν¬
https://www.acmicpc.net/problem/1103
https://github.com/jokj624/PS/blob/master/1000-5000/1103.cpp
π€― νμ€ νκΈ°
μ½λ μμ μ‘°μ¬νμ π
π€· λ¬Έμ
π©π» νμ΄
κ΅μ₯ν λ§μ΄ νλ Έλ€. λν μ€λΉ μ€ν°λ Algospecial 첫 λ§λ¨λ νμλ λ¬Έμ μΈλ° λ¬Έμ λ₯Ό μ½κ³ μ λ€ κ·Έλ₯ νμ΄λ³΄μκ³ νλ€.
λ±ν ν° μ κ·Ό λ°©μμ΄ νμν κ² κ°μ§ μμκ³ , λ¬Έμ μμ μꡬνλ λ°©μλλ‘ dfs μ½λλ§ κ΅¬νν΄μ£Όλ©΄ λ κ² κ°μλ€.
λμ μ΄ λ¬΄νλλ‘ μμ§μΈλ€λ κ²μ κ²°κ΅ νλ² λ°©λ¬Ένλ κ³³μ λ νλ² λ°©λ¬Ένλ κ²μ΄λ κ°μΌλ―λ‘ κ·Έλ κ² νλ¨ν΄μ£Όλ©΄ λλ€.
κ²°κ³Όμ μΌλ‘ λλ§κ³ λ€λ₯Έ μΉκ΅¬κ° λ¨Όμ ꡬνν΄μ μ μΆνμ§λ§ μλ§ TLE κ° λ¬λ κ² κ°λ€!
λΆλ₯λ₯Ό νλ² μ΄μ΄λ³΄κΈ°λ‘ νλ€.
DPλ₯Ό μ¨μ νΈλ λ¬Έμ μλ€ .. . λ΄κ° μ λ§ μ«μ΄νλ λ₯μ λ¬Έμ
μ νμμ μκ°ν΄λ΄€λλ° dp[x][y] = x, y μμΉ κΉμ§ μ€λλ° λμ μ΄ μμ§μΌ μ μλ μ΅λ νμ μ λλ‘ μκ°νκΈ°λ‘ νλ€.
ν΄λΉ μμΉμ μ΄λ―Έ λμ νμκ° μ μ₯λμ΄ μλ€λ©΄ λ μ΄μ νμνμ§ μκ³ λ°λ‘ λ°ννμ¬ μκ°μ μ€μΌ μ μμ κ² κ°μλ€.
λμ μ΄ ν΄λΉ μμΉμ μ ν μ«μλ§νΌ μμ§μ¬μΌ νκΈ° λλ¬Έμ nextx, nexty μ’νλ₯Ό ꡬν λ,
dx[i] * map[x][y]-'0', dy[i] * map[x][y]-'0' μ΄λ° μμΌλ‘ ꡬννλ€.
if(x < 0 || y < 0 || x >= N || y >= M) return 0; // κ²½κ³μ λ°μΌλ‘ λκ°μ κ²½μ° νμ μ’
λ£
if(map[x][y] == 'H') return 0; // ꡬλ©μ λΉ μ‘λ€λ©΄ ν΄λΉ νμ μ’
λ£
if(visit[x][y]){
printf("-1"); //νλ² λ°©λ¬Έν κ³³ μ¬λ°©λ¬Έ μ 무νλλ‘ λλ κ²μ΄λ―λ‘ -1 μΆλ ₯ ν μ’
λ£
exit(0);
}
if(dp[x][y]) return dp[x][y]; // μ΄λ―Έ dp λ©λͺ¨μ΄μ μ΄μ
λμ΄μλ€λ©΄ λ°ν
visit[x][y] = true; // λ°©λ¬Έ κΈ°λ‘
for(int i=0; i<4; i++){
int nx = x + dx[i]*(map[x][y]-'0');
int ny = y + dy[i]*(map[x][y]-'0'); // νμ¬ μ’νμμ κ° μ μλ μ’ν ꡬνκΈ°
dp[x][y] = max(dp[x][y], dfs(nx, ny)+1); // νμ¬ dpκ°, μλ‘μ΄ μ’ν dpκ° + 1 μ€ max κ° κ°±μ
}
visit[x][y] = false; // λ€μ νμμ μν΄ λ°©λ¬Έ κΈ°λ‘ μμ
return dp[x][y]; // μΆλ ₯
νμ νμ΄λ μ£Όμμ μ°Έκ³ νμκΈΈ!
μ, κ³μ νλ Έλ μ΄μ κ° λμλλ©΄
if(dp[x][y]) return dp[x][y];
if(visit[x][y]){
printf("-1");
exit(0);
}
λ°λ‘ μ΄ μμ λλ¬Έμ΄λ€.
무νλλ‘ λμ μ΄ λλ κ²μ λ¨Όμ 체ν¬νμ§ μκ³ , dpκ° λ°νλΆν° 체ν¬ν΄λ²λ €μ 무νλλ‘ λλλ dpκ°μ λ¨Όμ λ°νν΄λ²λ Έλ€.
μ΄κ±Έ μ°ΎλλΌ μμ²λκ² νλ Έμλ€ π
π» μ½λ
//AC
//BOJ 1103 κ²μ
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
string map[105];
int dp[105][105];
bool visit[105][105];
int dx[4] = {0, 0, -1, 1};
int dy[4] = {1, -1, 0, 0};
int N, M;
int dfs(int x, int y){
if(x < 0 || y < 0 || x >= N || y >= M) return 0;
if(map[x][y] == 'H') return 0;
if(visit[x][y]){
printf("-1");
exit(0);
}
if(dp[x][y]) return dp[x][y];
visit[x][y] = true;
for(int i=0; i<4; i++){
int nx = x + dx[i]*(map[x][y]-'0');
int ny = y + dy[i]*(map[x][y]-'0');
dp[x][y] = max(dp[x][y], dfs(nx, ny)+1);
}
visit[x][y] = false;
return dp[x][y];
}
int main(){
cin >> N >> M;
for(int i=0; i<N; i++){
cin >> map[i];
}
cout << dfs(0, 0);
return 0;
}
'DEV > PS' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[BOJ/9202] Boggle, c++ (1) | 2021.06.04 |
---|---|
[BOJ/21872] Deque Game, c++ (0) | 2021.06.04 |
[BOJ/13334] μ² λ‘, c++ (0) | 2021.05.20 |
[BOJ/18405] κ²½μμ μ μΌ, c++ (0) | 2021.05.17 |
[BOJ/20127] Y-μμ΄, C++ (0) | 2021.05.14 |