Logo냥냠감자기술 블로그
Skip to Content
작성일: 2024-01-12

문제

백준 16565 - N포커 

  • 난이도: 골드2
  • 알고리즘: DP, 조합론

코드

#include <iostream> #include <vector> using namespace std; vector<vector<int>> cache(53, vector<int>(53, -1)); int combination(int total, int pick) { if(total==pick || pick==0) { return 1; } int& ret=cache[total][pick]; if(ret!=-1) { return ret; } return ret=(combination(total-1, pick-1)+combination(total-1, pick))%10007; } int main() { int cardNum; cin>>cardNum; int ret=0; for(int i=4; cardNum-i>=0; i+=4) { int currPick=i/4; if(currPick%2==1) { ret+=(combination(13, currPick)*combination(52-i, cardNum-i))%10007; ret%=10007; } else { ret-=(combination(13, currPick)*combination(52-i, cardNum-i))%10007; if(ret<0) { ret+=10007; } } } cout<<ret; }

회고

약간 고등학교 확통 문제 같았다. n combination r = n-1 combination r + n-1 combination r-1 이라는 것을 안다면 이를 DP로 저장해 풀 수 있음을 알 수 있다.