본문 바로가기

PS/백준

[백준 1904번] 01타일 C++

728x90

www.acmicpc.net/problem/1904

 

1904번: 01타일

지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이

www.acmicpc.net

참나 다 풀어놓고 마지막에 처릴 잘 못 해서 엄청 시간쓴 문제;

DP로 푸는데 cnt 함수 변수로 타일의 남은 칸을 줬음

 

그리고 남은 칸들은 1로 구성된 1칸 or 00으로 구성된 2칸 순으로 채워올라가면서 

변수만큼의 칸을 다 채우는데 필요한 타일의 갯수를 구함

 

중요한건 cnt함수 내에서 메모이제이션값에 미리 %15746 처리를 했는데

변수 범위를 따지면 메모이제이션이 int 범위를 초과할 수 있고 이경우 틀림

(여기서 한참 헤맴)

 

조금.... dp에 다가서는느낌

 

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
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int dp[1000001];
 
int cnt(int x) {
    //기저사례
    if (x == 0return 0;
    if (x == 1return 1;
    if (x == 2return 2;
 
    int& ret = dp[x];
    if (ret != -1return ret % 15746;
 
    return ret = (cnt(x - 2+ cnt(x - 1)) % 15746;
}
int main() {
    int n;
    cin >> n;
    memset(dp, -1sizeof(dp));
    cout << cnt(n);
 
    return 0;
}
cs
728x90