题目描述
对于一个数列 { a i } 如果有 i < j且 ai > aj,那么我们称 ai 与 a j 为一对逆序对数。
若对于任意一个由 1 ∼ n 自然数组成的数列,可以很容易求出有多少个逆序对数。
那么逆序对数为 k 的这样自然数数列到底有多少个?
输入格式
第一行为两个整数 n ,k。
输出格式
写入一个整数,表示符合条件的数列个数,由于这个数可能很大,你只需输出该数对 10000 求余数后的结果。
输入样例
4 1
输出样例
3
样例说明
下列 3 个数列逆序对数都为 1,分别是:
1 2 4 3 ;
1 3 2 4 ;
2 1 3 4;
数据范围
n , k ≤ 1000
思路:
动态规划,dp[i][j]表示前i个数逆序对为j的数列数量。第i个数放在数列的第一个位置可以增加i-1个逆序对,放在第二个位置可以增加i-2个逆序对,。。。放在最后一个位置不增加逆序对。因此:
dp[i][j] = dp[i-1][j-(i-1)] + dp[i-1][j-(i-2)] + 。。。 + dp[i-1][j];
#include <bits/stdc++.h>
using namespace std;
const int N = 1010, MOD = 1e4;
typedef long long LL;
int n, k;
int dp[N][N];
int main()
{
cin >> n >> k;
dp[1][0] = 1;
for (int i = 2; i <= n; i ++)
{
LL sum = 0;
for (int j = 0; j < i & j <= k; j ++)
{
sum += dp[i - 1][j];
if(j - i >= 0)
{
sum -= dp[i - 1][j - i];
}
dp[i][j] = sum % MOD;
}
}
cout << dp[n][k] << endl;
return 0;
}