C

来源:互联网 发布:轩辕剑坐骑10进阶数据 编辑:程序博客网 时间:2024/05/17 03:43


题目链接

题意:

给出n和m,我们有一个由1~n组成的n个数字的数列a[],如果a[i]>i,我们就把ans++,我们要求出ans==m的数列有多少个。

思路:

直接按照dp的思想,我们考虑每增加一个数那么它只会是E-VAL的值要么不变 要么增加1

那么dp[i][j]就表示第i个数j E-val 的数列个数,可得出此动态转移方程

dp[i][j]=(dp[i][j]+(j+1)*dp[i-1][j])%mod;

dp[i][j+1]=(dp[i][j+1]+(i-j-1)*dp[i-1][j])%mod;

然后处理下边界即可

#include<bits/stdc++.h>#define mod 1000000007using namespace std;typedef long long ll;const int maxn=1111;ll dp[maxn][maxn];void init(){memset(dp,0,sizeof(dp));for(int i=1;i<maxn;i++){for(int j=0;j<i;j++){if(j==0)dp[i][j]=1;elsedp[i][j]=(dp[i][j]+(j+1)*dp[i-1][j])%mod;if(j<=i-2)dp[i][j+1]=(dp[i][j+1]+(i-j-1)*dp[i-1][j])%mod;}}return ;}int main(){int n,k;init();while(~scanf("%d %d",&n,&k)){printf("%lld\n",dp[n][k]);}return 0;}


1 0
原创粉丝点击