首页 > 其他 > 详细

51nod 1020 逆序排列

时间:2018-10-19 16:31:36      阅读:119      评论:0      收藏:0      [点我收藏+]

题目戳这里

题意是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[n][k] = (f[n][k - 1] + f[n - 1][k]) % M;
      if (k - n >= 0)
        f[n][k] = (f[n][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;
}

 

51nod 1020 逆序排列

原文:https://www.cnblogs.com/Rosebud/p/9817143.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!