首页 > 代码库 > hdu-2583 permutation
hdu-2583 permutation
http://acm.hdu.edu.cn/showproblem.php?pid=2583
题意: 输入 n m 问n组成的全排列中 有m个小于号的排列的个数
思路:
我们设
n(<=100)个数 1,2,...,n的排列有n!个 ,有k个小于号的有 f[n][k]个。
假如
a[1],a[2],...,a[n-1],是n-1个数的排列,有 k个‘<‘
把 n插入,有n个位置可以插入,
把 n插入到a[1]的前面, ‘<‘没有增加 , 1个位置
如 a[i]<a[i+1], 把 n插入到a[i+1]的前面, ‘<‘没有增加 , k个位置
插入到其他位置 ‘<‘增加
因此
f[n][k]=f[n-1][k]*(k+1) + f[n-1][k-1] *(n-k)
这个状态转移方程的初始状态:dp[n][0] = dp[n][n-1] = 1,因为分别只有为严格递增和严格递减一种情况。
#include<cstdio> #define N 101 #define inf 2007 int dp[N][N]; int main() { int n,k,i,j; for(i=0;i<N;i++) { dp[i][0]=1; dp[0][i]=0; } for(i=1;i<N;i++) for(j=1;j<N;j++) dp[i][j]=(dp[i-1][j]*(j+1)+dp[i-1][j-1]*(i-j))%inf; while(scanf("%d%d",&n,&k)!=EOF) { printf("%d\n",dp[n][k]); } return 0; }
hdu-2583 permutation
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。