「TC SRM625 D1L3」Seatfriends

思路

首先,对于计数题,不是 dp 就是排列组合,这题多思考一会儿就发现单纯 dp 和排列组合是做不出来的。然后激动人心地发现,这题是 dp + 排列组合。
现在来思考怎么做,我们可以发现如果不考虑区间两两之间的空座位,当成选为一个个集合的话是非常好 dp 的,但对于空格的处理无法使用 dp 处理的,同时对于两两不相邻的区间,必须插入至少 1 个空格以消除 dp 没考虑空格的影响。
现在问题就转换为有 i不同物品,共 nk 块隔板,要在每两个物品间插入至少一个相同隔板,问有多少种方案数,即盒子与球,计数为 Cnk1i1 ,再乘上 dpk,i 并将所有 i 加起来。

细节

对于 dp ,是一个插入 dp ,使用刷表更容易,定义 dpi,j 表示选了前 i 个人,共 j 个区间的方案数,然后推转移,若刷表即如下:

dpi,j×jdpi+1,j+1,dpi+1,j1

dpi,j×2jdpi,j

对于 dpi,j×j 即将当前数插入到/合并已有的 j 个区间。对于 dpi,j×2j 即加入到已有的 j 个区间的两侧。


对于计数,盒子与球的公式已给,现在就要将所有 dpm,i 加起来,答案就是

i=1kdpm,i×Cnm1i1

此外,对于 n=m 的情况,上述式子就失效了,因为 nm1<0 ,但因为最后只剩一个区间,所以可以取 dpm1,1 为答案,m1 的原因即在最后连成环之前必须是只剩一个区间而最后 dpm,1 会从不合法的 dpm1,2 转移。

Code

/*
address:https://vjudge.net/problem/TopCoder-12909
AC 2024/12/27 21:30
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 2005;
const int mod = 1e9 + 7;
int n, m, t;
LL dp[N][N];
LL C[N][N];
inline void trans(LL& x, LL y) { x = (x + y) % mod; }
inline LL power(LL a, LL k) {
    LL ret = 1;
    while (k > 0) {
        if (k & 1) ret = ret * a % mod;
        a = a * a % mod;
        k >>= 1;
    }
    return ret;
}
inline LL solve() {
    dp[1][1] = n;
    for (int i = 1;i < m;i++)
        for (int j = 1;j <= i && j <= t;j++) {
            if (j < t) trans(dp[i + 1][j + 1], dp[i][j] * j % mod);
            if (j > 1) trans(dp[i + 1][j - 1], dp[i][j] * j % mod);
            trans(dp[i + 1][j], dp[i][j] * j % mod * 2 % mod);
        }
    if (n == m) return dp[m - 1][1];
    LL ret = 0;
    for (int i = 1;i <= t;i++)
        trans(ret, dp[m][i] * C[n - m - 1][i - 1] % mod);
    return ret;
}
int main() {
    scanf("%d%d%d", &n, &m, &t);
    C[0][0] = 1;
    for (int i = 1;i <= n;i++) {
        C[i][0] = 1;
        for (int j = 1;j <= i;j++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % mod;
    }
    printf("%lld", solve());
    return 0;
}
posted @   keysky  阅读(21)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示