【LeetCode 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]。
来源:力扣(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个逆序对数组相关推荐
- LeetCode 629. K个逆序对数组(DP)
文章目录 1. 题目 2. 动态规划 3. 优化的DP 1. 题目 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数 ...
- 629. K个逆序对数组
629. K个逆序对数组 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < ...
- [LeetCode][H0629]K个逆序对数组(Java)(动态规划)
题目描述 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且 a[i ...
- 【数据结构与算法】之深入解析“K个逆序对数组”的求解思路与算法示例
一.题目要求 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第 i 个和第 j 个元素,如果满 i < ...
- XJTUOJ wmq的队伍(树状数组求 K 元逆序对)
题目链接:http://oj.xjtuacm.com/problem/14/[分析]二元的逆序对应该都会求,可以用树状数组.这个题要求K元,我们可以看成二元的.我们先从后往前求二元逆序对数, 然后对于 ...
- 【leetcode dp】629. K Inverse Pairs Array
https://leetcode.com/problems/k-inverse-pairs-array/description/ [题意] 给定n和k,求正好有k个逆序对的长度为n的序列有多少个,0& ...
- HDU 4911 http://acm.hdu.edu.cn/showproblem.php?pid=4911(线段树求逆序对)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4911 解题报告: 给出一个长度为n的序列,然后给出一个k,要你求最多做k次相邻的数字交换后,逆序数最少 ...
- 【DP】【高精】逆序对(jzoj 2014)
逆序对 jzoj 2014 题目大意: 有一个长为n的序列(由1,2,3,--n组成),问经过某种调整之后,有k个逆序对(即在前面的一个数大于后面的一个数这样的对)的种数,有多组数据,以0 0结尾 样 ...
- 【LeetCode】剑指 Offer 51. 数组中的逆序对
[LeetCode]剑指 Offer 51. 数组中的逆序对 文章目录 [LeetCode]剑指 Offer 51. 数组中的逆序对 package offer;public class Soluti ...
最新文章
- 拿大厂机器学习岗 offer,吐血整理的面试秘籍!
- 从拼多多分享文案中,我们学会了什么?
- 趣学python3(15)-f-string字符串
- 用Autofac替换.net core 内置容器
- Akka Actor远程调用
- 图解MySQL5.5详细安装与配置过程
- python3 读取写入excel操作-win32com
- 原来人生真的是一场苦的修行
- chaos-monkey-spring-boot小试牛刀
- 2020定额招投标报价评审办法及案例分享交流会圆满结束
- 免费医学统计软件——医统无忧智能统计软件(两组间比较:两独立样本t检验、非参数检验和卡方检验)操作说明和结果解读
- 改winpe注册信息及OEM信息
- Android 深度学习gan网络,使照片变为动漫化风格,毕业设计源码,android studio编译
- python怎么输入矩阵命令_python矩阵操作
- Trying other mirror问题
- Mindjet MindManager 2018 版本下载
- 前鹅厂面试官亲手整理出的高频必问软件测试基础面试题(1)!!!
- ftp下载工具 免费,3款绝对让你喜欢的免费ftp下载工具
- 这六大方法,如何让 Transformer 轻松应对高难度长文本序列?
- 简要概述服装设计管理
热门文章
- Oracle中用rownum替代Top函数的方法
- AspNet2.0页面生命周期
- 847. Shortest Path Visiting All Nodes(三)
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第2篇]多核处理器和向量处理器的区别
- Linux启动过程以及初始化
- c++ 不插入重复元素但也不排序_【每日一题】125. 对链表进行插入排序
- 12v小型电机型号大全_鄂破碎机型号大全图,小型鄂破碎机价格
- python中numpy是什么_什么是NumPy?
- px、dp和sp,这些单位有什么区别?
- \r,\n,\r\n