Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 자료구조
- 순열
- 스프링
- 다이나믹프로그래밍
- CI/CD
- 자바
- 브루트포스
- 이분탐색
- 알고리즘
- BFS
- 분할정복
- Spring
- 역방향 반복자
- 다이나믹 프로그래밍
- HTTP
- 그리드
- 도커
- 그래프
- 백준
- 그리드 알고리즘
- TCP
- 트리
- SQL
- GIT
- AWS
- dfs
- 분할 정복
- 컴퓨터 네트워크
- 재귀
- github action
Archives
- Today
- Total
코딩성장스토리
백준 1904번 : 01타일 본문
https://www.acmicpc.net/problem/1904
1904번: 01타일
지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동주가 지원이
www.acmicpc.net
이 문제는 실버 3 문제이고 다이나믹 알고리즘을 통해 부는 것이다.
엄청 오랜만에 알고리즘 문제를 보니 순간 머리가 띵햇다...
진짜 엄청 고민한거 같넹... (이제 부터 스프링 공부랑 병행하면서 해야할듯욤..)
일단 사실 피보나치랑 같은 개념이다. 천천히 생각해보자 (뒤에만 타일을 붙인다고 해도 무방) 괜히 앞에다가 붙이고 복잡하게 생각하지말자...
조건 1. 00타일만 붙일 수 있다.
조건 2 , 1 타일만 붙일 수 있다.
즉 f(n) 이 할 수 있는 모든 타일 갯수라고 했을 때
조건 1은 f(n-2) 에서 적용이 가능하고 여기서 f(n-1)도 모든 타일 갯수 즉 최적의 해다.
조건 2는 f(n-1) 에서 적용이 가능하다. 여기서 f(n-1)도 모든 타일 갯수 즉 최적의 해다.
고로 f(n) = f(n-1)+f(n-1) 이다 물론 이런 재귀는 부담되는 연산이 되므로 메모라이징으로 계산된 값을 기억하자
이제 코드를 보자
#include <iostream>
using namespace std;
int d[1000001];
int fibonacci(int n){
if(d[n]!=0){
return d[n];
}
if(n<=1){ //1일 떄는 타일 갯수 1
d[1]=1;
return d[1];
}
if(n==2){ //2일떄는 타일 갯수 2
d[2]=2;
return d[2];
}
d[n]=(fibonacci(n-1)+fibonacci(n-2))%15746; //피보나치 수열이랑 똑같음
return d[n];
}
int main(){
int t;
cin>> t;
int ans = fibonacci(t)%15746;
cout <<ans;
}
'백준 코딩' 카테고리의 다른 글
백준 14888: 연산자 끼워넣기 (0) | 2022.06.27 |
---|---|
백준 10816번: 숫자 카드2 (0) | 2022.06.05 |
백준 13305번: 주유소 (0) | 2022.04.25 |
백준:7562번 나이트의 이동 (0) | 2022.03.18 |
백준 2583번 : 영역 구하기 (0) | 2022.03.18 |