bzoj 2023 && bzoj 1630 dp+滚动数组


题意:n个数,共分为m种,求选出k个数的不同方案(在忽略顺序不同的前提下当且仅当方案内有一个数不同即为不同方案)

f[i,j]表示选前i种数,选出j个数的不同方案

f[i,j]=sigma(f[i-1,k])  ( max(j-w[i],0)<= k <=j )

显然O(n^2m)的复杂度是不可以的,所以我们用前缀和优化一下时间复杂度就变成了O(nm)

然后f[i,j]直接开数组空间也是会超的,所以滚动数组处理一下

答案要求输出最后六位数且不要前导0,等价于模1000000的结果

const
        mo=1000000;
var
        n,m,l,r,cur,x   :longint;
        i,j             :longint;
        sum,f           :array[0..1,0..100010] of longint;
        w               :array[0..1010] of longint;
begin
   read(n,m,l,r);
   for i:=1 to m do
   begin
      read(x);
      inc(w[x]);
   end;
   f[0,0]:=1;
   for i:=0 to m do sum[0,i]:=1;
   cur:=0;
   for i:=1 to n do
   begin
      cur:=cur xor 1;
      for j:=0 to m do
      begin
         f[cur,j]:=sum[cur xor 1,j];
         if (j-w[i]>0) then f[cur,j]:=(f[cur,j]-sum[cur xor 1,j-w[i]-1]) mod mo;
         if j=0 then sum[cur,j]:=f[cur,j]
           else sum[cur,j]:=(sum[cur,j-1]+f[cur,j]) mod mo;
         f[cur xor 1,j]:=0;
      end;
   end;
   writeln((sum[cur,r]-sum[cur,l-1]+mo) mod mo);
end.
——by Eirlys



智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告