1 条题解
-
0
题解
题意分析
题目要求计算 个元素的排列中,恰好有 个逆序的排列数量。
- 逆序:在排列中,如果 但 ,则称 为一个逆序。
- 输入:多组数据,每组数据给出 (排列长度)和 (目标逆序数),直到输入 时结束。
- 输出:对于每组数据,输出满足条件的排列数量。
解题思路
-
动态规划递推关系
- 设 表示 个元素的排列中,恰好有 个逆序的排列数量。
- 递推公式: 其中, 表示当前插入的数字在排列中的位置, 表示该插入操作新增的逆序数。
- 边界条件:
- (只有一个元素时,逆序数为 )。
- ( 时,不可能有逆序)。
- 预处理:由于 最大为 , 最大为 ,可以预先计算所有可能的 并存储。
-
代码实现
- 预处理 数组:
- 外层循环遍历 (排列长度),内层循环遍历 (逆序数)。
- 对于每个 和 ,计算所有可能的插入方式带来的贡献。
- 查询时直接输出 。
- 预处理 数组:
参考代码
#include <cstdio> #include <algorithm> #include <cstring> #include <cctype> using namespace std; typedef long long ll; ll dp[20][210]; int main(){ dp[1][0]=1; for(int i=2;i<=18;i++){ for(int j=0;j<=200;j++){ for(int k=1;k<=i;k++){ if(j-(i-k)>=0) dp[i][j]+=dp[i-1][j-(i-k)]; } } } int a,b; while(scanf("%d%d",&a,&b)!=EOF&&a!=0){ printf("%lld\n",dp[a][b]); } return 0; }
- 1
信息
- ID
- 1324
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者