範例程式碼 uva10721

//uva10721
/** 2016.12.13 - lin bi-shiang - uva10721 */
#include <cstdio>
#include <cstring>
#include <iostream>

using namespace std;

typedef long long LL;
LL dp[55][55][55];
bool vis[55][55][55];

LL solve( int n, int k, int m ) {

    if ( k == 1 && n > m ) return 0;

    if ( vis[n][k][m] == true )
        return dp[n][k][m];

    if ( k == 1 ) return 1;

    LL cnt = 0;
    for ( int i = n-1 ; i >= n-m && i > 0 ; --i ) {
        cnt += solve(i,k-1,m);
    }
    dp[n][k][m] = cnt;
    vis[n][k][m] = true;
    return dp[n][k][m];
}


int main() {
    int n, k, m;
    memset(dp,0,sizeof(dp));
    memset(vis,false,sizeof(vis));

    while( scanf("%d%d%d",&n,&k,&m) == 3 ) {
        //memset(dp,0,sizeof(dp));
        printf("%lld\n",solve(n,k,m));
    }
    return 0;
}