백준 11051번 이항 계수 2
< 백준 11051번 이항 계수 2 - 마포 코딩박 >
사용한 알고리즘: DP
순열조합의 nCk를 계산하는 문제였습니다. 단, n이 최대 10^3으로 꽤 크게 주어져서 DP를 활용하여 문제를 해결하였습니다.
문제풀이는 다음과 같습니다.
(1) (코드 7~8)
dp[n][k] = nCk%10007 값으로 설정했습니다.
(2) (코드 16~25)
nC0=1, nC1=n 임을 이용하여 dp[i][0]=1, dp[i][1]=i 의 초기 설정을 했습니다.
nCk = n-1Ck + n-1Ck-1 임을 이용하여 dp[2][2] ~ dp[1000][1000] 까지 계산해주었습니다.
사용한 알고리즘: DP
순열조합의 nCk를 계산하는 문제였습니다. 단, n이 최대 10^3으로 꽤 크게 주어져서 DP를 활용하여 문제를 해결하였습니다.
문제풀이는 다음과 같습니다.
(1) (코드 7~8)
dp[n][k] = nCk%10007 값으로 설정했습니다.
(2) (코드 16~25)
nC0=1, nC1=n 임을 이용하여 dp[i][0]=1, dp[i][1]=i 의 초기 설정을 했습니다.
nCk = n-1Ck + n-1Ck-1 임을 이용하여 dp[2][2] ~ dp[1000][1000] 까지 계산해주었습니다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using namespace std; | |
typedef long long ll; | |
const int MOD = 10007; | |
int N, K; | |
// dp[n][k] = nCk % MOD 값 | |
ll dp[1001][1001]; | |
int main(){ios::sync_with_stdio(false); cout.tie(NULL); cin.tie(NULL); | |
for(int i=1; i<=1000; ++i){ | |
dp[i][1] = (ll)i; | |
dp[i][0] = 1LL; | |
} | |
// dp 값 계산 | |
for(int i=2; i<=1000; ++i){ | |
for(int j=2; j<=1000; ++j){ | |
if(i==j){ | |
dp[i][j] = 1LL; | |
break; | |
} | |
dp[i][j] = (dp[i-1][j] + dp[i-1][j-1])%MOD; | |
} | |
} | |
cin >> N >> K; | |
cout << dp[N][K]%MOD << '\n'; | |
return 0; | |
} |
댓글
댓글 쓰기
긴 글 읽어주셔서 감사합니다.
궁금한게 있으시다면 댓글 달아주세요!