2145: 2017湖南多校第十三场-20170723

本文介绍了一道经典的排列组合问题,使用动态规划方法求解特定条件下的排列数量。问题要求计算长度为N的排列中,逆序对数量恰好为K的排列有多少种。文章详细解释了状态转移方程,并提供了完整的C++代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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++;
     }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机的小粽子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值