음준희 블로그
스터디 23/01/21 1563 : 개근상 본문
1563번: 개근상
백준중학교에서는 학기가 끝날 무렵에 출결사항을 보고 개근상을 줄 것인지 말 것인지 결정한다. 이 학교는 이상해서 학생들이 학교를 너무 자주 빠지기 때문에, 개근상을 주는 조건이 조금 독
www.acmicpc.net
풀이
DP로 풀이한다.
DP[n][l][a] = n번째 날까지 지각을 l번하고 결석을 a번한 경우의 수
지각을 2번하거나 결석을 3번한 경우 0을 리턴하고 n이 끝까지 가면 1을 리턴하여 모든 경우를 구한다.
시간복잡도 : O(n*2*3)
#include<bits/stdc++.h>
#include<time.h>
#define MAX 5000001
#define INF 2000000000
#define MOD 1000000
using namespace std;
typedef long long ll;
typedef pair<int, int > pii;
typedef pair<long long, long long> pll;
typedef pair<double, double> pdd;
int dx[8] = { 0, -1, 0, 1, 1, 1, -1, -1 };
int dy[8] = { -1, 0, 1, 0, -1, 1, 1, -1 };
/*
int dx[2][6] = {
{1, -1, 0, 0 ,1, -1},
{1, -1, 0, 0, -1, 1}
};
int dy[2][6] = {
{0, 0, 1, -1 ,1, -1},
{0, 0, 1, -1, 1, -1}
};*/
//int dx[8] = { -1, -1, 1, 1, -2, -2, 2, 2 };
//int dy[8] = { 2, -2, 2, -2, -1, 1, -1, 1 };
void init() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
}
ll gcd(ll a, ll b) { for (; b; a %= b, swap(a, b)); return a; }
ll lcm(ll a, ll b) { return (a * b) / gcd(a, b); }
ll dp[1001][2][3];
int n;
int func(int d,int l,int a) {
if (l >= 2 || a >= 3)
return 0;
else if (n == d)
return 1;
ll& res = dp[d][l][a];
if (res != -1) return res;
res = 0;
res += func(d + 1, l + 1, 0);
res %= MOD;
res += func(d + 1, l, 0);
res %= MOD;
res += func(d + 1, l, a + 1);
res %= MOD;
return res;
}
int main() {
init();
memset(dp, -1, sizeof(dp));
cin >> n;
cout<< func(0, 0, 0);
}'알고리즘 > 백준' 카테고리의 다른 글
| 백준 17469 : 트리의 색깔과 쿼리 (0) | 2023.01.28 |
|---|---|
| 백준 1222 : 홍준 프로그래밍 대회 (0) | 2023.01.28 |
| 스터디 23/01/21 10219 : Meats On The Grill (0) | 2023.01.27 |
| 스터디 23/01/14 2533 : 사회망 서비스(SNS) (1) | 2023.01.20 |
| 스터디 23/01/14 22238 : 가희와 btd5 (0) | 2023.01.20 |