게시글
질문&답변
2024.09.12
3-L 질문입니다.
답변감사합니다 선생님. 아직 풀리지 않은 의문점이 있는데요..!선생님답변그림과 같이 A에서 출발해서 D로 가는 경로중 서로 다른 경로지만 같은 알파벳을 가지고 D에 도착하는 경로를 dp를 이용해줘서 걸러내줘야한다는 질문 게시판 글을 읽었습니다.-> 제코드는 이 부분이 반영된 코드입니다. A, B, C .. 등의 방문 부분을 visited로 처리해서 해당 알파벳을 방문했다면 재방문이 불가능하게 되어있습니다. 라고 답변해주셨는데요. 저는 가능하다고 생각합니다. 더 자세하게 설명해 주실 수 있나요?(사진)해당 질문을 드릴 때 사용했던사진입니다. A->B->C->D 순서로 1번경로를 따라 다 탐색하고 나서 visited를 0으로 초기화하기 때문에 같은 A->B->C->D 알파벳을 가지긴 하지만 다른 경로인 2번 경로로 탐색할 수 있다고 생각하였고 이러한 탐색이 비효율적이라고 생각하였습니다.선생님 코드에서는 이 부분이 반영되어있다는 말씀이신거죠?
- 0
- 4
- 50
질문&답변
2024.09.04
3-L 질문입니다.
선생님 추가 질문도 있습니다.3.(사진) 그림과 같이 A에서 출발해서 D로 가는 경로중 서로 다른 경로지만 같은 알파벳을 가지고 D에 도착하는 경로를 dp를 이용해줘서 걸러내줘야한다는 질문 게시판 글을 읽었습니다.해당 코드를 구현하기 위해 이렇게 짜 보았습니다.하지만 60% 에서 시간초과가 발생하였습니다.선생님은 이 부분을 추가적으로 구현하는거에 대해서 어떻게 생각하시고, 구현하신다면 어떤식으로 구현하실지 궁금합니다. #define _CRT_SECURE_NO_WARNINGS #include using namespace std; const int max_int = 20; char a[max_int + 4][max_int + 4]; int dy[] = { 1,0,-1,0 }; int dx[] = { 0,1,0,-1 }; int r, c; int ret=1; vector> vvv[max_int+4][max_int+4]; bool flag; int check[26]; void dfs(int y, int x, vector v, int cnt) { ret = max(ret,cnt); for (int i = 0; i = r || nx >= c) continue; sort(v.begin(), v.end()); for (const auto& vv : vvv[ny][nx]) { if (vv == v) flag = true; if (flag) break; } if (flag) continue; if (check[a[ny][nx] - 'A']) continue; vvv[ny][nx].push_back(v); v.push_back(a[ny][nx]); check[a[ny][nx] - 'A'] = 1; dfs(ny, nx,v,cnt+1); v.pop_back(); check[a[ny][nx] - 'A'] = 0; } return; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> r >> c; for (int i = 0; i > a[i][j]; } } vector v; v.push_back(a[0][0]); check[a[0][0] - 'A'] = 1; dfs(0,0,v,1); cout
- 0
- 4
- 50