https://www.acmicpc.net/problem/1562
[유형] DP
[풀이]
bitmask를 이용한 3차원 dp를 이용해 해결이 가능합니다.
dp[n][m][bit] : 맨 앞자리수가 m이면서, 길이가 n이고, bit에 mask된 숫자들을 사용한 숫자들의 개수
#include <cstdio>
#include <cstring>
using namespace std;
int N,dp[101][10][1<<10],mod=1e9;
int sol(int n,int m,int bit){
if(n==N) return ((1<<m)|bit)==((1<<10)-1);
int& ret = dp[n][m][bit];
if(ret!=-1) return ret;
ret=0;
bit |= (1<<m);
if(m-1>=0) ret=(ret+sol(n+1,m-1,bit))%mod;
if(m+1<10) ret=(ret+sol(n+1,m+1,bit))%mod;
return ret;
}
int main(){
scanf("%d",&N);
memset(dp,-1,sizeof(dp));
int ans=0;
for(int i=1;i<10;i++){
ans+=sol(1,i,0);
ans%=mod;
}
printf("%d",ans);
}
https://github.com/has2/Problem-Solving/blob/master/boj-solved.ac/Gold1/1562.cpp
'Problem-Solving > BOJ' 카테고리의 다른 글
[BOJ/백준][Gold5] 19942 : 다이어트 (C++) (1) | 2022.05.13 |
---|---|
[BOJ/백준][Platinum5] 2568 : 전깃줄 - 2 (C++) (0) | 2022.05.13 |
[BOJ/백준][Gold5] 17265 : 나의 인생에는 수학과 함께 (C++) (0) | 2022.03.27 |
[BOJ/백준][Gold5] 9207 : 페그 솔리테어 (C++) (0) | 2022.03.27 |
[BOJ/백준][Gold5] 20500 : Ezreal 여눈부터 가네 ㅈㅈ (C++) (0) | 2022.03.27 |