BZOJ2699: 更新 dp
令 $f[i][k][j]$ 表示考虑前 $i$ 个位置,有 $k$ 次更新,且最大值为 $j$ 的方案数.
转移的话是一个前缀和.
由于是多组询问,所以可以先预处理出来.
细节什么的要注意一下.
code:
#include <bits/stdc++.h>
#define ll long long
#define mod 1000000007
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int f[160][302][160],sum[160][302][160];
int main()
{
// setIO("input");
for(int i=1;i<=300;++i) f[1][i][0]=1,sum[1][i][0]=(sum[1][i-1][0]+f[1][i][0])%mod;
for(int i=2;i<=150;++i)
for(int k=0;k<=i;++k)
{
for(int j=1;j<=300;++j)
{
f[i][j][k]=(ll)f[i-1][j][k]*j%mod;
if(k>0) (f[i][j][k]+=(ll)sum[i-1][j-1][k-1])%=mod;
}
for(int j=1;j<=300;++j)
sum[i][j][k]=(ll)(sum[i][j-1][k]+f[i][j][k])%mod;
}
int T,n,k,p,ans;
scanf("%d",&T);
while(T--) scanf("%d%d%d",&n,&k,&p),printf("%d\n",sum[n][k][p]);
return 0;
}

浙公网安备 33010602011771号