오늘의 알고리즘

[C++] 백준 2407 조합

하늘하늘 . 2022. 10. 9. 12:05
#include <iostream>
 
std::string DP[101][101] = {};
 
std::string Add(std::string sFirstNumber, std::string sSecondNumber)
{
    std::string sNumber = "";
    int iSum = 0;
    int iSize = std::max(sFirstNumber.size(), sSecondNumber.size());
 
    for (int i = 0; i < iSize || iSum; ++i)
    {
        if (sFirstNumber.size() > i)
            iSum += sFirstNumber[i] - '0';
 
        if (sSecondNumber.size() > i) 
            iSum += sSecondNumber[i] - '0';
 
        sNumber += iSum % 10 + '0';
        iSum /= 10;
    }
 
    return sNumber;
}
 
std::string combi(int iN, int iM) 
{
    if (iN == iM || iM == 0)
        return "1";
 
    std::string& ans = DP[iN][iM];
 
    if (ans != "") 
        return ans;
 
    ans = Add(combi(iN - 1, iM - 1), combi(iN - 1, iM));
 
    return ans;
}
 
int main() 
{
    int N = 0;
    int M = 0;
 
    std::cin >> N >> M;
 
    combi(N, M);
 
    for (int i = DP[N][M].size() - 1; i >= 0; --i)
    {
        std::cout << DP[N][M][i];
    }
 
    return 0;
}

1. nCm은 n-1Cm + n-1Cm-1 를 아는 것이 제일 중요합니다. 재귀함수로 불러서 계산해야 합니다. (DP)

2. long long의 범위를 넘어가기 때문에 바로 계산할 수가 없습니다. 그렇기 때문에 string으로 계산해야합니다.