LightOJ - 1326 - 人種(DP)

リンク:

https://vjudge.net/problem/LightOJ-1326

質問の意味:

DiskyとSooma、バングラデシュの最大のメガ心の二人は遠い国に行ってきました。彼らは、食べた符号化されても、彼らの休日に、周りさまよいました。彼らは、このように数ヶ月を通過しました。しかし、すべてが終了しています。聖なる人、Munsijiは、彼らの人生に入ってきました。Munsijiはダービー(競馬)にそれらを取りました。Munsijiはレースを楽しんだが、いつものようにDiskyとSoomaではなく、いくつかのロマンチックな瞬間を渡すの彼らのいつものように仕事をしました。彼らはレースが終了することができますどのように多くの方法でthinking-でした!誰が知っている、多分これは彼らのロマンスです!

レース中のN馬があります。あなたは出力にレースが終了することができますいくつかの方法があります。なお、複数の馬が同じ位置を得ることができます。例えば、2頭の馬は、3つの方法で終了することができます。

  1.  Both first
  2.  horse1 first and horse2 second
  3.  horse2 first and horse1 second

    アイデア:

    DP [i] [j]は、バッチ終了に合計ウマI、Jを表します。
    DP [I] [J] DP = [1-I] [J] J + Dpと[1-I] [J-1] J

    コード:

// #include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<string.h>
#include<set>
#include<queue>
#include<algorithm>
#include<math.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const int MOD = 10056;
const int MAXN = 1e6+10;

int Dp[1010][1010];
int n;

void Init()
{
    Dp[0][0] = 1;
    for (int i = 1;i <= 1000;i++)
    {
        for (int j = 1;j <= i;j++)
            Dp[i][j] = (Dp[i-1][j-1]*j%MOD + Dp[i-1][j]*j%MOD)%MOD;
    }
}

int main()
{
    // freopen("test.in", "r", stdin);
    Init();
    int t, cas = 0;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d", &n);
        printf("Case %d:", ++cas);
        int ans = 0;
        for (int i = 1;i <= n;i++)
            ans = (ans+Dp[n][i])%MOD;
        printf(" %d\n", ans);
    }

    return 0;
}

おすすめ

転載: www.cnblogs.com/YDDDD/p/12019522.html