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 | 31 |
Tags
- 백준 알고리즘
- 5강클로저
- c++
- React.StrictMode
- 타겟넘버
- 이중지도
- 2023카카오블라인드코테
- 프로그래머스
- pccp기출문제
- 과제진행하기
- DP
- div2개
- 비트마스크
- 최소스패닝트리
- 우박수열정적분
- 스택
- JS스터디
- 지도 여러개
- 코어자바스크립트
- solved.ac골드
- 두원사이의정수쌍
- 알고리즘 문제풀이
- 백준알고리즘
- Lv2
- 알고리즘문제풀이
- JS
- Lv3
- 정렬
- solved.ac플래티넘
- [pccp 기출문제]
Archives
- Today
- Total
호지
[백준 알고리즘] 1562번 계단 수 c++ 본문
dp와 비트마스크를 활용한 문제.
배열 dp[x][y][z]에서 x는 계단수의 길이, y는 0~9인 숫자, z는 비트마스크로 사용된 숫자를 체크한다.
길이가 1이면서 숫자 1~9가 사용되었을 때 dp를 채운다
(0으로 시작하는 수는 계단수가 아니므로 0은 제외)
길이가 2~n일때(len for문)
숫자 0~9에 대해(num for문)
비트마스크 0000000000~1111111111일 때(i for문)
dp값을 채운다.
i for문에서 해당 비트마스크를 순차탐색하여 dp를 채울 수 있는 이유는
길이가 1일때, dp[1][1][2], dp[1][2][4], dp[1][3][8]...이 1이고,
길이가 2일때, dp[2][0][3], dp[2][1][6], dp[2][2][1], dp[2][2][12]...이 2가 되는 것처럼
BFS와 같이 순차적으로 채워지기 때문이다.
i가 0~9일때 dp[n][i][1023] 값을 다 더하면 원하는 계단 수를 구할 수 있다.
* 모듈러 연산은 (a+b)%m = a%m + b%m이다
정수 범위 내로 정답을 얻기 위해 dp값을 채우는 도중에 %1000000000을 한다.
#include <iostream>
using namespace std;
int dp[101][10][1<<10];
int main(){
int n;
int mod = 1000000000;
cin >> n;
for(int i=1; i<10; i++)
dp[1][i][1<<i] = 1;
for(int len=2; len<=n; len++){
for(int num=0; num<10; num++){
for(int i=0; i<1024; i++){
if(num != 0)
dp[len][num][i | (1<<num)] = (dp[len][num][i | (1<<num)] + dp[len-1][num-1][i]) % mod;
if(num != 9)
dp[len][num][i | (1<<num)] = (dp[len][num][i | (1<<num)] + dp[len-1][num+1][i]) % mod;
}
}
}
int count = 0;
for(int i=0; i<10; i++){
count = (count+dp[n][i][1023]) % mod;
}
cout << count;
return 0;
}
'알고리즘 > 백준' 카테고리의 다른 글
[백준 알고리즘] 1647번 도시 분할 계획 (0) | 2022.05.02 |
---|---|
[백준 알고리즘] 1644번 소수의 연속 합 (0) | 2022.05.01 |
[백준 알고리즘] 1509번 팰린드롬 분할 c++ (0) | 2022.04.26 |
[백준 알고리즘] 1208번 부분 수열의 합2 문제풀이 c++ (0) | 2022.04.21 |
[백준 알고리즘] 1202번 보석 도둑 문제풀이 c++ (0) | 2022.04.20 |
Comments