首页 > 其他 > 详细

DP Training M 简单计数DP

时间:2021-02-06 13:33:28      阅读:33      评论:0      收藏:0      [点我收藏+]

DP Training M 简单计数DP

题意

\(N\)个孩子分\(K\)个糖果,第\(i\)个孩子分到的糖果要在\(0\)\(a_i\)之间

求分配的方案数,模1e9+7

\[1 \leq N \leq 100\0 \leq K \leq 10^5\0\leq a_i \leq K \]

分析

看数据量容易想到\(dp[i][j]\)表示当前枚举到第\(i\)个人,要掉\(j\)个糖果的方案数

\[dp[i][j] = \sum dp[i - 1][j - k] \]

复杂度\(O(nk^2)\)

显然后面是连续的和,可以前缀和优化

空间上,第一维明显可以滚动

代码

ll dp[maxn];
ll a[maxn],sum[maxn];

int main(){
	int n = rd();
	int k = rd();
	for(int i = 0;i < n;i++)
		a[i] = rd();
	dp[0] = 1ll;
	for(int i = 1;i <= n;i++){
		sum[0] = 0;
		for(int j = 1;j <= k + 1;j++) 
			sum[j] = sum[j - 1] + dp[j - 1];
		for(int j = 1;j <= k;j++)
			dp[j] = sum[j + 1] - sum[max(0ll,(ll)j - a[i - 1])],dp[j] %= MOD;
	}
	cout << dp[k];
} 

DP Training M 简单计数DP

原文:https://www.cnblogs.com/hznumqf/p/14381002.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!