51nod 1020 逆序排列

Posted rosebud

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1020 逆序排列相关的知识,希望对你有一定的参考价值。

题目戳这里

题意是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
", (f[a][b] + M) % M);
  }
  return 0;
}

 

以上是关于51nod 1020 逆序排列的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1020 逆序排列 递推DP

51Nod 1020 逆序排列

51nod 1020 逆序排列(dp,递推)

51nod 1020 逆序排列

51nod1020 逆序排列

51nod 1020 逆序排列(动态规划)