629. K个逆序对数组

给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数。

逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且 a[i] > a[j],则其为一个逆序对;否则不是。

由于答案可能很大,只需要返回 答案 mod 109 + 7 的值。

示例 1:输入: n = 3, k = 0
输出: 1
解释:
只有数组 [1,2,3] 包含了从1到3的整数并且正好拥有 0 个逆序对。示例 2:输入: n = 3, k = 1
输出: 2
解释:
数组 [1,3,2] 和 [2,1,3] 都有 1 个逆序对。

说明:

  • n 的范围是 [1, 1000] 并且 k 的范围是 [0, 1000]。

解题思路

状态转移公式的推导

例如当n=3 ,k=2时,xxx代表n=3时的逆序对数组的任意情况,我们需要计算n=4并且k=2的情况,可以看成是向n=3时的所有逆序对数组插入值4,下面是插入的几种情况

  1. 4xxx,因为4是当前的最大值,必然大于后面3个元素,所以能产生3对逆序对,超出了k=2
  2. x4xx,因为4是当前的最大值,必然大于后面2个元素,所以必然能产生2对逆序对,又因为我们需要逆序对的数量k=2,所以只能从n=2,k=0的情况转移而来
  3. xx4x,因为4是当前的最大值,必然大于后面1个元素,所以必然能产生1对逆序对,又因为我们需要逆序对的数量k=2,所以只能从n=2,k=1的情况转移而来
  4. xxx4,因为4在最末尾,所以不能产生新的逆序对,又因为我们需要逆序对的数量k=2,所以只能从n=2,k=2的情况转移而来

因此我们可以得出
dp[n+1][k]=dp[n][k-1]+dp[n][k-2]…dp[n][k-n+1]

使k=k+1得
dp[n+1][k+1]=dp[n][k]+dp[n][k-1]…dp[n][k-n+2]

两式相减得:dp[n][k]=dp[n-1][k]+dp[n][k-1]-dp[n-1][k-n]

代码

class Solution {public:int kInversePairs(int n, int k) {vector<vector<int>> dp(n+1,vector<int>(k+1,0));dp[1][0]=1;int mod=1000000007;for (int i = 2; i <=n; ++i) {for (int j = 0; j <=k; ++j) {dp[i][j]=dp[i-1][j]+(j-1>=0?dp[i][j-1]:0)-(j-i>=0?dp[i-1][j-i]:0);if (dp[i][j]>=mod)dp[i][j]-=mod;else if (dp[i][j]<0)dp[i][j]+=mod;}}return dp[n][k];}
};

629. K个逆序对数组相关推荐

  1. LeetCode 629. K个逆序对数组(DP)

    文章目录 1. 题目 2. 动态规划 3. 优化的DP 1. 题目 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数 ...

  2. 【LeetCode 629】K个逆序对数组

    给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且 a[i] > ...

  3. 【数据结构与算法】之深入解析“K个逆序对数组”的求解思路与算法示例

    一.题目要求 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第 i 个和第 j 个元素,如果满 i < ...

  4. [LeetCode][H0629]K个逆序对数组(Java)(动态规划)

    题目描述 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且 a[i ...

  5. XJTUOJ wmq的队伍(树状数组求 K 元逆序对)

    题目链接:http://oj.xjtuacm.com/problem/14/[分析]二元的逆序对应该都会求,可以用树状数组.这个题要求K元,我们可以看成二元的.我们先从后往前求二元逆序对数, 然后对于 ...

  6. HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...

  7. 【DP】【高精】逆序对(jzoj 2014)

    逆序对 jzoj 2014 题目大意: 有一个长为n的序列(由1,2,3,--n组成),问经过某种调整之后,有k个逆序对(即在前面的一个数大于后面的一个数这样的对)的种数,有多组数据,以0 0结尾 样 ...

  8. 【leetcode dp】629. K Inverse Pairs Array

    https://leetcode.com/problems/k-inverse-pairs-array/description/ [题意] 给定n和k,求正好有k个逆序对的长度为n的序列有多少个,0& ...

  9. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

最新文章

  1. 嗨:VSCode和IDEA都请安装上这个神奇的插件
  2. Asp.Net web.config配置节点大全详解
  3. 男人在最穷、最落魄,事业低谷期的时候最需要的是什么?
  4. U-Time巡回完美收官 演讲嘉宾干货分享:数据篇
  5. 软件测试对计算器的测试,软件测试计算器的测试用例
  6. 中国口岸年鉴(2001-2015年)
  7. 虚拟机VMware安装ubuntu教程
  8. Linux 远程连接Windows执行命令方法总结
  9. linux无法识别NIC,linux – 为什么ethtool没有向我显示NIC的所有属性?
  10. 从制造到智造,用友U9 cloud2022成为制造业专精特新高效增长新引擎
  11. 初学音视频(一)-RGB和YUV格式分析
  12. 在macOS下如何格式化磁盘
  13. Nvidia GPU的浮点计算能力(FP64/FP32/FP16)
  14. springboot 与rabbitmq集成+生产者投递确认+消费者手动确认+TTL+死信队列+延时队列
  15. utils.data的使用
  16. BZOJ 4833: [Lydsy1704月赛]最小公倍佩尔数(数论 + 最值反演)
  17. c++安全编写对象池中文版
  18. 重庆:智能网联汽车驶入“快车道”,中国“底特律”走向复兴?
  19. dubbo源码解析之框架粗谈
  20. C# 代码规范和质量检查工具 StyleCop.Analyzers

热门文章

  1. 进程与线程的区别(面试题)
  2. 多线程顺序交替打印ABCD
  3. Java面试题及答案,java入门书籍
  4. java环境变量的配置与详解,这些知识你必须拿下
  5. MMKV集成与原理,轻松拿下offer
  6. java struts2 ajax_在struts2的Action中返回Ajax数据
  7. 微信小程序之视图容器(swiper)组件创建轮播图
  8. gulp 实现sass自动化 ,监听同步
  9. strerror和perror函数详解
  10. 计算机中的数(一):数在计算机中的表示