题解 SP64 【PERMUT1 - Permutations】

Snowflake_Pink

2018-12-08 22:07:34

Solution

~~我会告诉你这是三倍经验题吗。。。~~ 做完这道你可以去做[P1521 求逆序对](https://www.luogu.org/problemnew/show/P1521)和[P2513 [HAOI2009]逆序对数列](https://www.luogu.org/problemnew/show/P2513) ~~但是我并不确定我的代码在P2513不会TLE~~ ------------ 在这道题中,你会发现你逆序对的个数只和**相对大小有关**!! 然后就可以建立DP模型:dp[i][j]表示i个不同的数的所有排列中,逆序对数量为j的排列个数。初始边界为dp[1][0]=1。 关于dp方程:当有i-1个数时,有j-1个逆序对时,添加第i个数,必有一个位置刚好使逆序对数+1,即可转移到dp[i][j]。同理j-2,j-3……j-(i-1),因为只有i-1个数,所以最多到i-1,当然也可能不增加逆序对。 Code: ```cpp #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; } ``` 本蒟蒻第一篇题解。有什么不好的地方可以私信留言哈~~~ ^_^