1 条题解

  • 0
    @ 2025-6-16 19:48:40

    题意分析

    求把nn个身高各不相同的孩子排成一队,有m组可以说话的排法(两个孩子相邻,或者两者之间的其他人身高都比自己矮则可以说话)

    解题思路

    dp[i][j]dp[i][j]表示把 ii 个孩子分成 jj 组可以说话的分法,从ii个孩子中拿出最矮的那一个,则还剩下 i1i-1人,而身高最矮的这个孩子,有两种放置方法——1)放在其他任意两个人之间,则这只队伍增加了两组可以说话的人,有i2i-2个放法(可以用人少时找规律)2)放在边上,则增加了一组可以说话的人,有两种放法(队列的头,尾)。

    可得出递推公式——dp[i][j]=dp[i1][j2](i2)+dp[i1][j1]2dp[i][j] = dp[i-1][j-2]*(i-2) +dp[i-1][j-1]*2;

    #define _CRT_SECURE_NO_WARNINGS
    
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    const int maxm = 10000 + 10;
    const int maxs = 80 + 10;
    using namespace std;
    int dp[maxs][maxm];
    int n, m;
    int main()
    {
        while (~scanf("%d%d", &n, &m) && n) {
            dp[1][0] = 1;
            dp[2][1] = 2;
            for (int i = 1; i <= n; i++)
                for (int j = 2; j <= m; j++) {
                    dp[i][j] = (dp[i - 1][j - 2] * (i - 2) + 2 * dp[i - 1][j - 1]) % 9937;
                }
            printf("%d\n", dp[n][m]);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    2927
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者