逆序统计 题解
题目传送门:
这里提供一种比DP好写的记忆化递归:
#include <iostream>
using namespace std;
int n, k, f[101][4951]; // 尽量压缩空间
int dp(int a, int b){
if (b < 0) return 0;
if (f[a][b]) return f[a][b]; // 记忆化搜索,不做解释
if (b == a * (a - 1) / 2) return 1; // 如果数列有 a 个数,刚好有 a * (a - 1) / 2个逆序对,数列就只能是 a, a - 1, ……, 1,这样才可以让逆序对的数量达到最大。
if (b > a * (a - 1) / 2) return 0; // 这样是无法达到的
int sum = 0;
for (int i = 1;i <= a;i ++) sum += dp(a - 1, b - i + 1), sum %= 10007; // 转移方程
return f[a][b] = sum;
}
int main(){
cin >> n >> k;
cout << dp(n, k);
}

浙公网安备 33010602011771号