题目描述:
求1-n所形成的的排列中能形成K个逆序对个数的方案.
答案对10000取模
题目分析:
DP题…
DP[i][j]为到i为止有j个逆序对方案数.
DP[1][0]=1
因为i这个数比前面任何一个数都要大,那么如果插在第1个数字前面,就会形成i-1的逆序对
….以次类推…
插在最后,形成不了逆序对.
DP[i][j]=∑jk=max(i−j+1,0)dp[i−1][k]
D
P
[
i
]
[
j
]
=
∑
k
=
m
a
x
(
i
−
j
+
1
,
0
)
j
d
p
[
i
−
1
]
[
k
]
这是个
N3
N
3
的转移。
用前缀和优化一下变成
N2
N
2
另外DP[i][?]总是由DP[i-1][?]转移而来
可以滚动数组搞一搞.
题目链接:
AC 代码:
#include <cstdio>
#include <iostream>
const int maxm=1005;
const int mod=10000;
int f[maxm],sum[maxm];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0;i<=k;i++) sum[i]=1;
for(int i=2;i<=n;i++,f[0]=1)
{
for(int j=0;j<=k;j++)
{
if(j>=i) f[j]=(sum[j]-sum[j-i]+mod)%mod;
else f[j]=sum[j]%mod;
}
for(int j=1;j<=k;j++)
sum[j]=(sum[j-1]+f[j]+mod)%mod;
}
printf("%d\n",f[k]);
return 0;
}