P1001 bang!bang!

我们考虑合法的方案中 选出的个音符中 每相邻两个音符之间都至少隔了
每两个相邻之间可以选择删除个音符 一共删除个音符
题目就转化为了在个音符无限制的选择个 答案为C()。

数据范围只给到了1000 那么做法就很多了 可以用杨辉三角求组合数,没有推出组合数也可以用的dp做,更快的还有用逆元预处理 查询,总之 这些做法都是可以的。
这里给一个杨辉三角的程序做展示。

class Solution {
public:
    /**
     *
     * @param n int整型 乐谱总音符数
     * @param m int整型 重音符数
     * @param k int整型 重音符之间至少的间隔
     * @return long长整型
     */
    const static int N = 1010, mod = 1e9 + 7;
    long long c[N][N];
    long long solve_bangbang(int n, int m, int k) {
        // write code here
        int d = n - k * (m - 1);

        if (d <= 0 || d < m) return 0;

        for (int i = 0; i < N; i ++ )
            for (int j = 0; j <= i; j ++ )
                if (!j) c[i][j] = 1;
                else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;

        return c[d][m];
    }
};
全部评论

相关推荐

不愿透露姓名的神秘牛友
07-09 11:30
找工作7个月,投了7000封,3段世界五百强实习,才有一个offer,牛油们肯定比我强吧
码农索隆:不对不对不对,实习经历这么厉害,简历也没少投,问题出在哪呢
点赞 评论 收藏
分享
机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务