Posts 12849 본대산책
Post
Cancel

12849 본대산책

12849 본대산책

알고리즘(DP)

1
2
3
4
1. a라는 건물에 x분을 남기고 들어가는 것은, a에 연결된 모든 건물 b에 x+1분을 남기고 들어온 것과 같음
2. 즉, 정보과학관에 0분을 남기고 들어오는 것을 시작으로 모든 경우를 탐색하면 된다.
3. 쭉쭉 내려가다가 D분에 도달했을때, 장소가 정보과학관이면 1, 아니면 0을 리턴하여 바텀업으로 함
4. DP에는 현재 위치와 시간으로 배열을 만들고, 그 위치에서 그 시간이 걸렸을 때의 결과를 1000000007로 나눈 값을 저장함

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <vector>
#include <cstring>
#define MAX_MINUTE 100000
#define DIVIDE 1000000007

using namespace std;

//0 : 정보, 1 : 전산, 2 : 미래, 3 : 신양 , 4: 한경직,
//5 : 진리, 6 : 형남, 7 : 학생
vector<vector<int>> map = { {1,2}, {0,2,3}, {0,1,3,4}, {1,2,4,5}, {2,3,5,6}, {3,4,7}, {4,7}, {5,6} };
int D;
int DP[8][MAX_MINUTE];

int getMin(int num, int minute);

int main() {
	memset(DP, -1, sizeof(DP));
	cin >> D;
	cout << getMin(0, 0) << endl;
}
/*
a 에 x를 남기고 들어오는 횟수는
	a와 연결된 모든 b에 x+1를 남기고 들어오는 횟수와 같음
*/

int getMin(int num, int minute) {
	if (minute == D)
		return num == 0 ? 1 : 0;
	if (DP[num][minute] != -1)
		return DP[num][minute];

	long long result = 0;
	int length = map[num].size();
	for (int i = 0; i < length; i++)
		result += getMin(map[num][i], minute + 1);

	return DP[num][minute] = result % DIVIDE;
}
This post is licensed under CC BY 4.0 by the author.

1248 맞춰봐

12969 ABC

Comments powered by Disqus.