Atcoder M
题意 给你n个人 然后每个人都有个吃糖上线
问把 K 个糖分给 n 个人的方案数
我们首先容易得到转移方程 dp[i][j] 代表到第 i 个人为止 吃了 j 颗糖的方案数
那么容易想到O(nkk)的转移方程
int L = j + 1;
int R = j + min(k-j,up_to);
for(int i = L;i<=R;++i)
add(dp[i],tmp);
那么我们发现利用一下差分前缀和的trick
不就可以减少一个 k 的复杂度了么
代码如下
for(int j = k;j>=0;--j)
{
int tmp = dp[j];
int L = j + 1;
int R = j + min(k-j,up_to);
if(L<=R)
{
add(sum[L],tmp);
if(R+1<=k)
{
sub(sum[R+1],tmp);
}
}
}
/*
if you can't see the repay
Why not just work step by step
rubbish is relaxed
to ljq
*/
#include <cstdio>
#

一道关于分配糖果的数学问题,要求计算将K颗糖分给n个人的不同方案数。通过动态规划的方法,可以得出dp[i][j]表示前i个人吃j颗糖的方案数。通过使用差分前缀和技巧,可以将时间复杂度从O(n*k^2)优化至O(n*k)。博客提供了具体的代码实现。
最低0.47元/天 解锁文章
8067

被折叠的 条评论
为什么被折叠?



