标签:
Problem 3 Permutation (permutation.cpp/c/pas)
【题目描述】
将 1 到 N 任意排列,然后在排列的每两个数之间根据他们的大小关系插入“>”和“<”。
问在所有排列中,有多少个排列恰好有K个“<”。
例如排列(3, 4, 1, 5, 2)
3 < 4 > 1 < 5 > 2
共有2个“<”
【输入格式】
N,K
【输出格式】
答案
【样例输入】
5 2
【样例输出】
66
【数据范围】
20%:N <= 10
50%:答案在0..2^63-1内
100%:K < N <= 100
思路:f[i,j]表示n为i,k为j时的序列数。
打了一张表发现规律了
| 
 i/j  | 
 0  | 
 1  | 
 2  | 
 3  | 
 4  | 
| 
 1  | 
 1  | 
 
  | 
 
  | 
 
  | 
 
  | 
| 
 2  | 
 1  | 
 1  | 
 
  | 
 
  | 
 
  | 
| 
 3  | 
 1  | 
 4  | 
 1  | 
 
  | 
 
  | 
| 
 4  | 
 1  | 
 11(4*2+1*3)  | 
 11(i*3+4*2)  | 
 1  | 
 
  | 
| 
 5  | 
 1  | 
 26(11*2+1*4)  | 
 66(11*3+11*3)  | 
 26(1*4+11*2)  | 
 1  | 
| 
 6  | 
 1  | 
 57(26*2+1*5)  | 
 302(66*3+26*4)  | 
 302(26*4+66*3)  | 
 57(1*5+26*2)  | 
(红加蓝=i+1)
f[i,j]:=f[i-1,j]*(j+1) + f[i-j,j-1]*((i+1)-(j+1)) (j从0开始)
ps:要使用高精加
标签:
原文地址:http://www.cnblogs.com/liuxinyu/p/4936409.html