K个逆序数组
输入正整数n k
1-n个数,可以有多少种具有k个逆序对的排列
解法
动态规划:
dp[i][j]:前i个数排列为具有j个逆序对的序列的个数
对于前i-1个数的所有组合而言,最新插入的i是最大的数,所有i的插入可以带来0到i-1个逆序对。并且对于每一种可能,带来固定数量逆序对的方式是唯一的。比如
1 3 2 4 插入5 希望带来两个逆序对时的操作只有一种可能 就是
1 3 5 2 4
有:
dp[i][j] = dp[i-1][j] + dp[i-1][j-1]+...dp[i-1][j-i+1]
dp[i][j-1] = dp[i-1][j-1] + dp[i-1][j-2]+...dp[i-1][j-i]
整理:dp[i][j] = dp[i-1][j] + dp[i-1][j-1]+...dp[i-1][j-i+1]+(dp[i-1][j-i]-dp[i-1][j-i])
= dp[i][j-1] + dp[i-1][j] -dp[i-1][j-i]
当j>=i时 dp[i-1][j-i]有意义