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]。

假如当前的4个数字的排列方式为:xxxx
再往其中添加一个数字5有如下几种添加方式: xxxx5
多出0个逆序对,因此有:
f1(5,k)=f(4,k)
xxx5x
多出1个逆序对,因此有:
f2(5,k+1)=f(4,k)=> f2(5,k)=f(4,k-1)
xx5xx
多出1个逆序对,因此有:
f3(5,k+2)=f(4,k)=> f3(5,k)=f(4,k-2)
x5xxx
多出1个逆序对,因此有:
f4(5,k+3)=f(4,k)=> f4(5,k)=f(4,k-3)
5xxxx
多出1个逆序对,因此有:
f5(5,k+4)=f(4,k)=> f5(5,k)=f(4,k-4)
=>
f(5,k) = f1 + f2 + f3 + ... + f5
=>
f(5,k) = f(4,k) + f(4,k-1) + f(4,k-2) + f(4,k-3) + f(4,k-5+1)
=>
f(n,k) = f(n-1,k)+f(n-1,k-1) + f(n-1,k-2) + f(n-1,k-3) + ... + f(n-1,k-n+1)
=>
f(n,k+1) = f(n-1,k+1) + f(n-1,k-1) + f(n-1,k-2) + ... + f(n-1,k-n+2)
=>
f(n,k+1) - f(n,k) = f(n-1,k+1) - f(n-1,k-n+1)
=>
f(n,k+1) = f(n,k) + f(n-1,k+1) - f(n-1,k-n+1)
=>
f(n,k) = f(n,k-1) + f(n-1,k) - f(n-1,k-n) 两个递推公式: f(n,k) = f(n-1,k)+f(n-1,k-1) + f(n-1,k-2) + f(n-1,k-3) + ... + f(n-1,k-n+1)
f(n,k) = f(n,k-1) + f(n-1,k) - f(n-1,k-n)
class Solution {

      public int kInversePairs(int n, int k) {
long[][] dp = new long[n + 1][k + 1];
if(k > n*(n - 1) / 2 || k < 0)
return 0;
if(k == 0 || k == n *(n - 1) / 2)
return 1; int mod = 1000000007;
dp[2][0] = 1;
dp[2][1] = 1;
for(int i = 3 ; i <= n ; i ++){
dp[i][0] = 1;
for(int j = 1 ; j <= Math.min(k, n * (n - 1) / 2); j ++){
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
if(j >= i)
dp[i][j] -= dp[i - 1][j - i];
dp[i][j] = (dp[i][j] + mod) % mod; //处理dp[i][j]为负数的情况
}
}
return (int)dp[n][k];
}
}

最新文章

  1. MySql 导出excel
  2. BZOJ2448 : 挖油
  3. ES6转码器babel的使用
  4. 【转】websocket协议规范
  5. ARC 下处理内存暴涨的一个解决办法
  6. Android面试题整理【转载】
  7. CalendarUtil
  8. 给枚举加上Description,必要时,可以直接获取枚举类型代表的中文
  9. 金山网络2014春季Android实习生招聘-成都站-笔试第二题
  10. oracle使用exp与imp在本地导入导出数据
  11. html系列教程--article audio
  12. 闲聊DOS命令
  13. 树莓派3B+ HDMI连接显示屏 因供电问题而不能进入系统
  14. 小技巧,把Markdown文本发布到微信公众号文章
  15. day 9~11 函数
  16. select()函数 的学习
  17. 【译】第8节---EF Code First中配置类
  18. Asp.net(C#)常用正则表达式封装
  19. 复杂度O(n)计算
  20. OC基础:内存(进阶):retain.copy.assign的实现原理 分类: ios学习 OC 2015-06-26 17:36 58人阅读 评论(0) 收藏

热门文章

  1. mongodb windows 集群搭建
  2. [zoj 3416/hdu 3709]数位DP
  3. python 基础知识2-数据类型
  4. Mysql 常用函数(2)- if 函数
  5. 800+Java后端经典面试题,希望你找到自己理想的Offer呀~
  6. CSS3 拯救我的布局吧box-sizing
  7. c#word文档输出
  8. 一、HDFS 原理分析
  9. 复变函数-MINDMAPS-continuous updating
  10. vuecli3.x与vuecli2.x 主要区别