sicily 1687. Permutation

来源:互联网 发布:完美假期周晨曦淘宝店 编辑:程序博客网 时间:2024/06/05 19:43

http://soj.sysu.edu.cn/show_problem.php?pid=1687

因为每次加进去的数是最大的,所以只有两种情况,一种就是加入之后个数不变,另一种就是+1

例子: 1<2<4>3 

加入5后不变的情况是把5加入处于小于号的地方或者最左边,有 5>1<2>4<3 , 1<5>2>4<3, 1<2<5>4>3  三种情况  即小于号的个数+1

加入5后+1的情况是把5加入处于大于号的地方或者最右边,有 1<2<4<5>3 , 1<2<4>3<5 两种情况 即大于号的个数+1

那么n个数的有k个小于号的数是从n-1个数中有k-1个小于号的数和k个小于号的数得来

于是有 a[n][k] = a[n-1][k-1]*(n-k)+a[n-1][k]*(k+1)

注意有个坑,输入可能会有n == k的情况,a[n][k] = 0,也不能算是坑吧,题目有写k可能=100。。。。

#include <iostream>using namespace std;int main(){int n,k;int a[101][101] = {0};a[1][0] = 1;a[1][1] = 0;for(int i = 2;i < 101;i++){a[i][0] = 1;a[i][i] = 0;for(int j = 1;j < i;j++){a[i][j] = a[i-1][j-1]*(i-j)+a[i-1][j]*(j+1);if(a[i][j] >= 2007) a[i][j] %= 2007;}}while(cin >> n >> k)cout << a[n][k] << endl;}

0 0
原创粉丝点击