SSLOJ·俄罗斯套娃【DP】【前缀和】

SSLOJ 1475 俄罗斯套娃

    • Description--
    • Input--
    • Output--
    • Sample Input--
    • Sample Output--
    • 说明--
    • 解题思路--
    • 代码--

Description–

SSLOJ·俄罗斯套娃【DP】【前缀和】_第1张图片


Input–

在这里插入图片描述

Output–

在这里插入图片描述


Sample Input–

10 1000

Sample Output–

3628800

说明–

SSLOJ·俄罗斯套娃【DP】【前缀和】_第2张图片


解题思路–

d[ i ][ j ] = ∑(l = 0 ~ i - 1) d[ i - 1 ][ j - l ]
+
前缀和 q[ i ][ j ] = ∑(l = 0 ~ j) d[ i ][ l ]


代码–

#include 
#include 
#include 

using namespace std;

const long long M = 10000000007;

int n, k, t, tt;
long long ans, d[2][3005], q[2][3005];

int main()
{
	scanf("%d%d", &n, &k);
	for (int i = 0; i <= k; ++i)
	  q[0][i] = 1; //初始化
	d[0][0] = tt = 1;
	for (int i = 1; i <= n; ++i)
	{
		tt = t, t = abs(t - 1); //滚动
		for (int j = 0; j <= k; ++j)
		{
			d[t][j] = q[tt][j];                                         //相当于d[t][j] = d[tt][(j - (i - 1)) ~ j]
			if (j - i >= 0) d[t][j] = (d[t][j] - q[tt][j - i] + M) % M; //减法可能减出负数
			q[t][j] = d[t][j];                                //
			if (j > 0) q[t][j] = (q[t][j] + q[t][j - 1]) % M; //前缀和
    	}
	}
	printf("%lld", q[t][k]);
	
	return 0;
} 

你可能感兴趣的:(前缀和,DP)