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];
}
};
上海得物信息集团有限公司公司福利 1208人发布
查看20道真题和解析