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; }