G(1968):Permutation Descent Counts
题目大意:
对于任一种N的排列A,定义它的E值为序列中满足A[i]>A[i+1]的数的个数。给定N和K(K<=N<=1000),问N的排列中E值为K的个数。
题解: 一题简单的dp
dp[x][y]表示 【1->x】的所有排列中,E值为y的个数。
很明显 长度为x,且 E值为y时的序列,是由长度为x-1,且E值为y或者y-1的序列得到。
例如: 长度为 3,且E 值为 1的序列有: 1 3 2 , 2 1 3 , 2 3 1 , 3 1 2 所以dp[3][1]=4;
以上序列可以由 序列 12 , E值为 0 : 21 ,E值为 1 通过插入3得到,
对于序列 12 ,插入的位置为: _ 12 , 1 _ 2 ;
对于序列 21 , 插入的位置为: 21_ , 2 _ 3
所以状态转移方程: dp[x][y]=(dp[x-1][y](y+1)+dp[x-1][y-1](x-y))%1001113;
#include <iostream>
#include<algorithm>
using namespace std;
int dp[1005][1005]={0};
int main()
{
for(int x=0;x<1005;x++)
dp[x][0]=1;
for(int x=2;x<1005;x++)
for(int y=1;y<=x-1;y++)
dp[x][y]=(dp[x-1][y]*(y+1)+dp[x-1][y-1]*(x-y))%1001113;
int a,b,c;
int t,sum=1;
cin>>t;
while(sum<=t)
{
cin>>a>>b>>c;
cout<<sum<<" "<<dp[b][c]<<endl;
sum++;
}
}