给出两个整数 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]。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/k-inverse-pairs-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题报告:

经典动态规划。dp[i][j]代表1~i可以构成逆序对为k的方案数。

考虑转移dp[i][j],即最后一步决策,即在1~i-1已经放好的基础上,i放到哪个位置上,放到不同的位置上可以新增0~i-1中的某个值。当然,也不能超了j。即更新dp[i][j]时,决策第i层可以新层逆序对的个数:0~min(i-1, j)。对应加和就行。然后用前缀和优化一下。空间也可以滚动数组优化但是没啥必要了就不写了。

AC代码:

class Solution {
public:long long dp[1005][1005];long long sum[1005];const int mod = 1e9 +7;int kInversePairs(int n, int k) {dp[0][0] = 0;for(int i = 1; i<=n; i++) dp[i][0] = 1;for(int i = 1; i<=n; i++) {sum[0] = dp[i-1][0];for(int j = 1; j<=k; j++) {sum[j] = (sum[j-1] + dp[i-1][j])%mod;}for(int j = 1; j<=k; j++) {int down = min(i-1,j);dp[i][j] = (sum[j] - (j-down-1>=0?sum[j-down-1]:0) + mod) % mod;}}return dp[n][k] % mod;}
};

TLE代码:

class Solution {
public:long long dp[1005][1005];const int mod = 1e9 +7;int kInversePairs(int n, int k) {dp[0][0] = 0;for(int i = 1; i<=n; i++) dp[i][0] = 1;for(int i = 1; i<=n; i++) {for(int j = 1; j<=k; j++) {for(int q = 0; q<=i-1; q++) {if(j-q < 0) break;dp[i][j] += dp[i-1][j-q];dp[i][j] %= mod;}}}// for(int i = 0; i<=n; i++) {//     for(int j = 0; j<=k; j++) {//         cout << dp[i][j] << " ";//     }//     cout <<endl;// }        return dp[n][k] % mod;}
};

【LeetCode 629】K个逆序对数组相关推荐

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

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

  2. 629. K个逆序对数组

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 【LeetCode】剑指 Offer 51. 数组中的逆序对

    [LeetCode]剑指 Offer 51. 数组中的逆序对 文章目录 [LeetCode]剑指 Offer 51. 数组中的逆序对 package offer;public class Soluti ...

最新文章

  1. 拿大厂机器学习岗 offer,吐血整理的面试秘籍!
  2. 从拼多多分享文案中,我们学会了什么?
  3. 趣学python3(15)-f-string字符串
  4. 用Autofac替换.net core 内置容器
  5. Akka Actor远程调用
  6. 图解MySQL5.5详细安装与配置过程
  7. python3 读取写入excel操作-win32com
  8. 原来人生真的是一场苦的修行
  9. chaos-monkey-spring-boot小试牛刀
  10. 2020定额招投标报价评审办法及案例分享交流会圆满结束
  11. 免费医学统计软件——医统无忧智能统计软件(两组间比较:两独立样本t检验、非参数检验和卡方检验)操作说明和结果解读
  12. 改winpe注册信息及OEM信息
  13. Android 深度学习gan网络,使照片变为动漫化风格,毕业设计源码,android studio编译
  14. python怎么输入矩阵命令_python矩阵操作
  15. Trying other mirror问题
  16. Mindjet MindManager 2018 版本下载
  17. 前鹅厂面试官亲手整理出的高频必问软件测试基础面试题(1)!!!
  18. ftp下载工具 免费,3款绝对让你喜欢的免费ftp下载工具
  19. 这六大方法,如何让 Transformer 轻松应对高难度长文本序列?
  20. 简要概述服装设计管理

热门文章

  1. Oracle中用rownum替代Top函数的方法
  2. AspNet2.0页面生命周期
  3. 847. Shortest Path Visiting All Nodes(三)
  4. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第2篇]多核处理器和向量处理器的区别
  5. Linux启动过程以及初始化
  6. c++ 不插入重复元素但也不排序_【每日一题】125. 对链表进行插入排序
  7. 12v小型电机型号大全_鄂破碎机型号大全图,小型鄂破碎机价格
  8. python中numpy是什么_什么是NumPy?
  9. px、dp和sp,这些单位有什么区别?
  10. \r,\n,\r\n