您的位置:首页 > 其它

51nod 1020 逆序排列

2020-04-01 18:40 27 查看

题目戳这里

题意是n个数字,问逆序对为k的排列有多少种。

令f(n,k)表示n个数时,逆序对为k的排列种数。考虑k个逆序对时,第n个数字的放置的情况:

这第n个数可以插入的位置为n-i,其中i∈[0,n-1],插在第n-i个位置,则产生i个逆序对,不插入时,n-1个数则恢复成k-i个逆序对。

则有f(n,k)=∑f(n-1,k-i) 其中i∈[0,n-1] ,为了消去这个求和,同理:

f(n,k-1)=∑f(n-1,k-1-i),上下两式相减,然后移项可得: f(n,k)=f(n,k-1)+f(n-1,k)-f(n-1,k-n)。dp即可:

#include <stdio.h>
const int M=1e9+7;
int cas, a, b, f[1005][20005];

void init() {
for (int i = 1; i <= 1000; ++i)
f[i][0] = 1;
for (int n = 2; n <= 1000; ++n) {
for (int k = 1; k <= 20000; ++k) {
f
[k] = (f
[k - 1] + f[n - 1][k]) % M;
if (k - n >= 0)
f
[k] = (f
[k] - f[n - 1][k - n]) % M;
}
}
}
int main () {
init();
scanf("%d", &cas);
while (cas--) {
scanf("%d%d", &a, &b);
printf("%d\n", (f[a][b] + M) % M);
}
return 0;
}

 

转载于:https://www.cnblogs.com/Rosebud/p/9817143.html

  • 点赞
  • 收藏
  • 分享
  • 文章举报
dlsq3814 发布了0 篇原创文章 · 获赞 0 · 访问量 229 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: