SP64 [PERMUT1 - Permutations]

2018 年 12 月 8 日 星期六(已编辑)
15

SP64 [PERMUT1 - Permutations]

我会告诉你这是三倍经验题吗。。。

做完这道你可以去做P1521 求逆序对和[P2513 [HAOI2009]逆序对数列](https://www.luogu.org/problemnew/show/P2513)

但是我并不确定我的代码在P2513不会TLE


题面

在这道题中,你会发现你逆序对的个数只和相对大小有关!!

然后就可以建立DP模型:dp[i][j]dp[i][j]表示ii个不同的数的所有排列中,逆序对数量为jj的排列个数。初始边界为dp[1][0]=1dp[1][0]=1

关于dpdp方程:当有i1i-1个数时,有j1j-1个逆序对时,添加第ii个数,必有一个位置刚好使逆序对数+1+1,即可转移到dp[i][j]dp[i][j]。同理j2,j3j(i1)j-2,j-3……j-(i-1),因为只有i1i-1个数,所以最多到i1i-1,当然也可能不增加逆序对。

Code:

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,k,w;
int dp[1001][1001];
int main(){
    scanf("%d",&w);
    while (w--){
        memset(dp,0,sizeof (dp));
        scanf("%d%d",&n,&k);
        dp[1][0]=1;
        for(int i=1;i<=n;i++){
            for(int j=0;j<=k;j++){
                for(int l=0;l<i;l++){
                    if(j>=l)
                        dp[i][j]+=dp[i-1][j-l];
                }
            }
        }
        printf("%d\n",dp[n][k]);
    }
    return 0;
}

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...