그냥 주위 친구가 풀어낸 거 보고 나도 풀어볼까? 하고 문제를 풀게 되었다.
문제를 처음 봤을 때는 BFS / 다익스트라 or 플로이드와샬 이라고 생각했는데 BFS로만 풀릴 것 같았다.
다시 생각해보니 input이 12로 제한되어있고 이진트리로 가지치며 나오는 최종 경우의 수를 생각해봐도 leaf에서 2^6으로 모든 경우의 수가 128보다 적다. 3초나 주어지는 것을 보니 브루트포스로 풀어낼 수 있을 것 같았다.
풀며 식을 세우다가 느꼈는데 DP로 식을 세울 수 있어 보였다. 물론 dp식을 세우는데 실패해서 시간을 낭비하고 브루트포스로 구현하였지만 맞춘사람을 보니 BFS와 DP로 풀어낸 경우도 확인할 수 있었다. 브루트포스를 이진트리 느낌으로 구현하다보니 조금 귀찮아 골드 문제가 아니였나 싶다.
#include<bits/stdc++.h>
using namespace std ;
vector< vector<int> > input(12, vector<int>(12)) ;
vector< vector< pair< int, int> > > answer(6) ;
int main()
{
cout << 1e9;
ios::sync_with_stdio(0), cin.tie(0) ;
for(int i = 0 ; i < 12 ; i++)
for(int j = 0 ; j < 12 ; j++)
cin >> input[i][j] ;
answer[0].push_back(make_pair(input[0][1], 1)) ;
answer[0].push_back(make_pair(input[1][0], 0)) ;
for(int i = 1 ; i < 6 ; i++)
{
for(int j = 0 ; j < answer[i-1].size() ; j++)
{
int first = answer[i-1][j].first + input[answer[i-1][j].second][i*2] + input[i * 2][i * 2 + 1];
int second = answer[i-1][j].first + input[answer[i-1][j].second][i*2 + 1] + input[i * 2 + 1][i * 2];
answer[i].push_back(make_pair(first, i * 2 + 1)) ;
answer[i].push_back(make_pair(second, i * 2)) ;
}
}
int real_answer = 0x3f3f3f3f ;
for(pair<int,int> tmp : answer[5])
if(tmp.first < real_answer) real_answer = tmp.first ;
cout << real_answer ;
}
느낀점: dp나 BFS로 구현한 코드들을 보고 다음에 이해해봐야겠다.
문제: https://www.acmicpc.net/problem/25824
25824번: 빠른 오름차순 메시지 전달
선생님 1명과 학생 12명이 있다. 학생에게 1번부터 12번까지 번호가 부여된다. 학생들은 두 명씩 하나의 친구 집단을 이룬다. 1번 학생부터 번호순으로 두 명씩 하나의 친구 집단에 포함된다. 즉,
www.acmicpc.net
'Problem Solving > 백준' 카테고리의 다른 글
[백준/C++] 1920번 수 찾기 (0) | 2023.01.10 |
---|---|
[백준/C++] 25947번 선물할인 (0) | 2022.12.12 |
[백준/C++] 23306번 binary는 호남선 (0) | 2022.11.29 |
[백준/C++] 6549번 히스토그램 분할정복 증명 (0) | 2022.11.28 |
[백준/C++] 1744번 수 묶기 (0) | 2022.10.19 |