5546번: 파스타
boj.ma
N일동안 파스타를 먹을건데, 파스타의 종류는 3가지이고 3일 연속으로 같은 종류의 파스타를 먹으면 안됩니다.
그리고 특정 날짜에 반드시 먹어야 하는 파스타의 종류가 주어집니다.
N일까지 파스타를 먹는 모든 경우의 수를 구하는 문제입니다.
완전탐색부터 접근해봅니다.
재귀함수로 완전탐색을 할건데,
recur(cur, a, b) := 현재 cur일이고, 어제 a종류의 파스타, 그제 b종류의 파스타를 먹었을때 N일까지 도착하는 경우의 수
라고 정의 하고 완전탐색을 하면
제가 계산한건 대략 9^100 이라고 생각했는데 혹시 아니라면 댓글 부탁드립니다.
9^100번 연산을 하면 시간초과라는 것을 알 수 있습니다.
현재 5일차고, 어제 1번종류, 그제 2번 종류 파스타를 먹었다고 해봅시다. 그리고 우리는 10일차까지 가야합니다.
그럼 1 ~ 4일차 까지 1 2 2 1, 3 2 2 1, 2 1 2 1, ... 등과 같이 채울 수 있을텐데, 1 ~ 4일차에 어떤 선택을 했든 상관없이
"현재 5일차고, 어제 1번종류, 그제 2번 종류 파스타를 먹었다" 에서 N일차까지 가는 경우의 수는 항상 일정할 것입니다.
다음 경우에 영향을 주는 요소는 어제랑 그제 뿐이니까요.
따라서 dp를 적용할 수 있습니다.
완전탐색에서의 함수 정의를 그대로 사용하면 됩니다.
code(c++)
#include <bits/stdc++.h>
#define endl "\n"
#define NM 101010
#define MAX 1010100
#define BIAS 1048576
#define MOD 20170805
#define X first
#define Y second
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define FOR(i) for(int _=0;_<(i);_++)
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(v) v.begin(), v.end()
#define fastio ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int n, k;
int arr[111], dp[111][111][111];
const int mod = 10000;
int recur(int cur, int a, int b){ // 현재 cur일이고, 어제 a, 그제 b 먹음
if (cur == n + 1) return 1;
int&ret = dp[cur][a][b];
if(~ret) return ret;
ret = 0;
if (arr[cur]){ // 오늘 먹어야할게 정해져있음
if (a == b && b == arr[cur]) return 0;
ret += recur(cur + 1, arr[cur], a);
ret %= mod;
}
else{
for (int i = 1; i <= 3; i++){
if (a == b && b == i) continue;
ret += recur(cur + 1, i, a);
ret %= mod;
}
}
return ret;
}
void input() {
cin >> n >> k;
for (int i = 0; i < k ; i++){
int a, b;
cin >> a >> b;
arr[a] = b;
}
}
void pro() {
memset(dp, -1, sizeof dp);
cout << recur(1, 0, 0) << endl;
}
int main() {
fastio;
#ifndef ONLINE_JUDGE
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
input();
pro();
return 0;
}
'알고리즘 문제 풀이' 카테고리의 다른 글
백준 20425 아침은 고구마야(Easy) (1) | 2024.03.14 |
---|---|
프로그래머스 기사단원의 무기 (1) | 2024.02.26 |
백준 1756 피자굽기 (0) | 2024.02.22 |
백준 31230 모비스터디 (1) | 2024.02.12 |
백준 17179 케이크 자르기 (1) | 2024.02.12 |