ํ ํธ๋ก๋ฏธ๋ ธ ์ฑ๊ณต
2 ์ด 512 MB 63552 23730 15438 35.571% ๋ฌธ์
ํด๋ฆฌ์ค๋ฏธ๋ ธ๋ ํฌ๊ธฐ๊ฐ 1×1์ธ ์ ์ฌ๊ฐํ์ ์ฌ๋ฌ ๊ฐ ์ด์ด์ ๋ถ์ธ ๋ํ์ด๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์กฐ๊ฑด์ ๋ง์กฑํด์ผ ํ๋ค.
- ์ ์ฌ๊ฐํ์ ์๋ก ๊ฒน์น๋ฉด ์ ๋๋ค.
- ๋ํ์ ๋ชจ๋ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค.
- ์ ์ฌ๊ฐํ์ ๋ณ๋ผ๋ฆฌ ์ฐ๊ฒฐ๋์ด ์์ด์ผ ํ๋ค. ์ฆ, ๊ผญ์ง์ ๊ณผ ๊ผญ์ง์ ๋ง ๋ง๋ฟ์ ์์ผ๋ฉด ์ ๋๋ค.
์ ์ฌ๊ฐํ 4๊ฐ๋ฅผ ์ด์ด ๋ถ์ธ ํด๋ฆฌ์ค๋ฏธ๋ ธ๋ ํ ํธ๋ก๋ฏธ๋ ธ๋ผ๊ณ ํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ 5๊ฐ์ง๊ฐ ์๋ค.
์๋ฆ์ด๋ ํฌ๊ธฐ๊ฐ N×M์ธ ์ข ์ด ์์ ํ ํธ๋ก๋ฏธ๋ ธ ํ๋๋ฅผ ๋์ผ๋ ค๊ณ ํ๋ค. ์ข ์ด๋ 1×1 ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์์ผ๋ฉฐ, ๊ฐ๊ฐ์ ์นธ์๋ ์ ์๊ฐ ํ๋ ์ฐ์ฌ ์๋ค.
ํ ํธ๋ก๋ฏธ๋ ธ ํ๋๋ฅผ ์ ์ ํ ๋์์ ํ ํธ๋ก๋ฏธ๋ ธ๊ฐ ๋์ธ ์นธ์ ์ฐ์ฌ ์๋ ์๋ค์ ํฉ์ ์ต๋๋ก ํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
ํ ํธ๋ก๋ฏธ๋ ธ๋ ๋ฐ๋์ ํ ์ ์ฌ๊ฐํ์ด ์ ํํ ํ๋์ ์นธ์ ํฌํจํ๋๋ก ๋์์ผ ํ๋ฉฐ, ํ์ ์ด๋ ๋์นญ์ ์์ผ๋ ๋๋ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ข ์ด์ ์ธ๋ก ํฌ๊ธฐ N๊ณผ ๊ฐ๋ก ํฌ๊ธฐ M์ด ์ฃผ์ด์ง๋ค. (4 ≤ N, M ≤ 500)
๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์ ์ข ์ด์ ์ฐ์ฌ ์๋ ์๊ฐ ์ฃผ์ด์ง๋ค. i๋ฒ์งธ ์ค์ j๋ฒ์งธ ์๋ ์์์๋ถํฐ i๋ฒ์งธ ์นธ, ์ผ์ชฝ์์๋ถํฐ j๋ฒ์งธ ์นธ์ ์ฐ์ฌ ์๋ ์์ด๋ค. ์ ๋ ฅ์ผ๋ก ์ฃผ์ด์ง๋ ์๋ 1,000์ ๋์ง ์๋ ์์ฐ์์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ ํธ๋ก๋ฏธ๋ ธ๊ฐ ๋์ธ ์นธ์ ์ฐ์ธ ์๋ค์ ํฉ์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1 ๋ณต์ฌ
5 5 1 2 3 4 5 5 4 3 2 1 2 3 4 5 6 6 5 4 3 2 1 2 1 2 1
์์ ์ถ๋ ฅ 1 ๋ณต์ฌ
19
์์ ์ ๋ ฅ 2 ๋ณต์ฌ
4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
์์ ์ถ๋ ฅ 2 ๋ณต์ฌ
20
์์ ์ ๋ ฅ 3 ๋ณต์ฌ
4 10 1 2 1 2 1 2 1 2 1 2 2 1 2 1 2 1 2 1 2 1 1 2 1 2 1 2 1 2 1 2 2 1 2 1 2 1 2 1 2 1
์์ ์ถ๋ ฅ 3 ๋ณต์ฌ
7
์์ ํ์ ๋ฌธ์ ์ด๊ณ , ์กฐ๊ฑด์ ๋ฐ๋ผ DFS๋ฅผ ํด์ฃผ๋ฉด ๋๋ ๋ฌธ์ ์ด๋ค.
ใ ๋ฅผ ์ ์ธํ ๋ค๋ฅธ ๋ชจ์๋ค์ ๊ทธ๋ฅ DFS์๋ฒ์ด 4๋ฒ์งธ๊ฐ ๋๋ ๊ฒฝ์ฐ์ด๊ณ , ใ ๋ชจ์์ผ ๊ฒฝ์ฐ๋ ๊ทธ ์ด์ ๋ ธ๋์์ ๋ค์ DFS๋ฅผ ๋๋ ค์ฃผ๋๋ก ํ์๋ค.
์ข๋ ์ค๋ ฅ์ด ๋๋ฉด ํจ์ฌ ๊ฐ๊ฒฐํ๊ฒ ์ฝ๋๋ฅผ ์งค ์ ์์ ๊ฒ ๊ฐ๋ค.
#include <iostream>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
int N, M, dx[4]={1,0,-1,0}, dy[4]={0,1,0,-1}, board[501][501], vis[501][501], ans;
void dfs(pair<int,int>cur, int count, int point){
if(count == 4){
ans = max(ans, point);
return;
}
for(int dir=0; dir<4; dir++){
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if(nx<0||nx>N||ny<0||ny>M) continue;
if(vis[nx][ny] ) continue;
vis[nx][ny] = 1;
dfs({nx,ny}, count+1, point+board[nx][ny]);
vis[nx][ny] = 0;
}
if(count == 3){
for(int dir=0; dir<4; dir++){
int nx = cur.first + dx[dir];
int ny = cur.second + dy[dir];
if(nx<0||nx>N||ny<0||ny>M) continue;
if(vis[nx][ny]){
for(int dir2=0; dir2<4; dir2++){
int nx2 = nx + dx[dir];
int ny2 = ny + dy[dir];
if(nx2<0||nx2>N||ny2<0||ny2>M) continue;
if(vis[nx2][ny2]) continue;
vis[nx2][ny2] = 1;
dfs({nx2, ny2}, count+1, point+board[nx2][ny2]);
vis[nx2][ny2] = 0;
}
return;
}
}
}
}
int main(){
cin>>N>>M;
for(int i=0; i<N; i++)
for(int j=0; j<M; j++)
cin>>board[i][j];
for(int i=0; i<N; i++)
for(int j=0; j<M; j++){
pair<int,int> cur = {i, j};
vis[i][j] = 1;
dfs(cur, 1, board[i][j]);
vis[i][j] = 0;
}
cout<<ans;
}