这是一道dp题目。
考虑转移f[i][j],此时,i是最大的,所以,无论插在哪里,都可以产生贡献。
for(int i=1;i<=n;i++)
{
f[i][0]=1;
f[i][1]=i-1;
for(int j=2;j<=k;j++)
for(int k=1;k<=j+1&&k<=i;k++)
f[i][j]=(f[i][j]+f[i-1][j-k+1])%mod;
}
O(nk^2)的,交上去可以过了(不科学啊),但是,有优化方法。
首先f[i]完全是从f[i-1]来的,滚动数组上。
发现,还可以用前缀和来优化一下,多好最后,就是O(nk)的了。
#include<bits/stdc++.h>
#define mod 10000
int f[1001],tmp[1001];
int sum[1001];
int n,k;
int main()
{
std::cin>>n>>k;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=k;j++)tmp[j]=0;
tmp[0]=1;
tmp[1]=i-1;
for(int j=2;j<=k;j++)
if(j+1>=i)tmp[j]=(sum[j]-sum[j-i]+mod)%mod;
else tmp[j]=sum[j];
for(int j=0;j<=k;j++)f[j]=tmp[j];
sum[0]=f[0];
for(int j=1;j<=k;j++)sum[j]=(sum[j-1]+f[j])%mod;
}
std::cout<<f[k]%mod;
return 0;
}