Description
将1到n任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”。问在所有排列中,有多少个排列恰好有k个“<”。答案对2015取模。
注:1~n的排列指的是1~n这n个数各出现且仅出现一次的数列。
Input
第一行2个整数n,k。
Output
一个整数表示答案。
Range
对于30%的数据:n <= 10
对于100%的数据:k < n <= 1000
Solution
dp找规律题
我们设 f[i][j] 表示 i 个数有 j 个 < 的方案数
接下来考虑放第 i+1 个数
可以观察到,如果放到 > 旁边,会额外产生一个 <;如果放到 < 旁边,会额外产生一个 >
我们又知道,对于 i 个数有 j 个<,就有 (i-1-j) 个>
那么转移方程就推出来了
f[i][j]=(j+1)*f[i-1][j]+(i-j)*f[i-1][j-1]
Code
#include<cstdio> #define mod 2015 using namespace std; int n,k; int f[1005][1005]; signed main(){ scanf("%d%d",&n,&k); for(int i=1;i<=n;i++){ f[i][0]=1; for(int j=1;j<n;j++) f[i][j]=f[i-1][j]*(j+1)+f[i-1][j-1]*(i-j),f[i][j]%=mod; } printf("%d",f[n][k]%mod); return 0; }
原文地址:https://www.cnblogs.com/YoungNeal/p/8495940.html
时间: 2024-09-30 16:07:22