逆序统计 题解

题目传送门:

洛谷P1521

这里提供一种比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);
}
posted @ 2021-07-30 15:33  鱼缸下的我  阅读(37)  评论(0)    收藏  举报