bzoj 2431 简单dp/递推

来源:互联网 发布:淘宝申请账号注册 编辑:程序博客网 时间:2024/06/08 18:42

题意:对于一个1~n的全排列,逆序对数为k的排列有几个

对于一个已经排好的1~i-1的排列,我们插入数i,可以贡献[0,i-1]个逆序对

所以第1~i的逆序对为m的排列可以由1~i-1的逆序对为[m-i+1,m]的排列插入数i形成

令f[i,j]表示1~i的全排列中逆序对数为j的排列总数

得出关系(方程):f[i,j]=sigma(f[i-1,j-k]) (0<=k<=i-1)

时间复杂度为O(n^3)

然后很显然f[i,j]是由f[i-1]的一段连续的区间和得来,那么我们对f[i-1,j]维护一个前缀和sum[j]即可优化为O(n^2)

const        mo=10000;var        f               :array[0..1010,0..1010] of longint;        n,m             :longint;        i,j             :longint;        sum             :array[-1..1010] of longint;function max(a,b:longint):longint;begin   if a<b then exit(b) else exit(a);end;begin   read(n,m);   for i:=1 to n do f[i,0]:=1;   for i:=2 to n do   begin      for j:=0 to m do sum[j]:=sum[j-1]+f[i-1,j];      for j:=1 to m do f[i,j]:=(sum[j]-sum[max(-1,j-i)]+mo) mod mo;   end;   writeln(f[n,m]);end.
——by Eirlys

 

0 0
原创粉丝点击