0w1

TIOJ 1291 N箱M球 ( DP )

1291 - G.N 箱M 球 | TIOJ INFOR Online Judge
dp[ m ][ n ]: m顆球放入 n個箱子,每個箱子至少有一樣東西
這麼一來轉移就很明顯,因為只有球有序所以很好做,轉移要嘛就是丟進一個新的箱子,要嘛就選一個已經有球的箱子,這樣不會有重複計算。一開始我把邊界設成 dp[ i ][ 1 ] = 1,然後試著用一樣的方法轉移結果不對,應該是漏算了什麼,或是枚舉的順序出了問體好複雜。果然這種刷表法的動態規劃方式還是盡量把索引值 0的邊界處理好再乖乖做比較好。

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 200 + 2;
const int MAXM = 200 + 2;
const int MOD = 1e6;

int n, m;

int dp[ MAXM ][ MAXN ];

void solve(){
    memset( dp, 0, sizeof(dp) );
    dp[ 0 ][ 0 ] = 1;
    for(int i = 0; i < MAXM - 1; ++i)
        for(int j = 0; j <= i; ++j){
            ( dp[ i + 1 ][ j ] += dp[ i ][ j ] * j ) %= MOD;
            ( dp[ i + 1 ][ j + 1 ] += dp[ i ][ j ] ) %= MOD;
        }
}

int main(){
    solve();
    while( scanf("%d%d", &n, &m) == 2 && n + m ){
        int ans = 0;
        for(int i = 1; i <= n; ++i)
            ( ans += dp[ m ][ i ] ) %= MOD;
        printf("%d\n", ans);
    }
    return 0;
}