bzoj1037: [ZJOI2008]生日聚会Party

传送门

dp题目一道。

设男生为1,女生为-1

显然当前缀和最大最小是会不符合要求

所以得到状态

F[I][J][K][L]表示放了i个男生,j个女生,且这段人的后缀中男孩与女孩的个数之差最大值为k,女孩与男孩的个数之差最大值为l的方案总数。

于是我们枚举当前位置放男生还是女生,方程自己YY一下。

可以状压压掉一维。

uses math;
var
  f,g:array [0..155,-25..5,-5..25] of longint;
  n,m,p,i,j,k,l,ans:longint;
begin
  read(n,m,p);
  f[0,0,0]:=1;
  for i:=1 to n+m do
    begin
      fillchar(g,sizeof(g),0);
      for j:=max(0,i-m-1) to min(i-1,n) do
        for k:=-p to 0 do
          for l:=k to k+p do
            begin
              g[j+1,min(2*j-i+2,k),max(2*j-i+2,l)]:=(g[j+1,min(2*j-i+2,k),max(2*j-i+2,l)]+f[j,k,l]) mod 12345678;
              g[j,min(2*j-i,k),max(2*j-i,l)]:=(g[j,min(2*j-i,k),max(2*j-i,l)]+f[j,k,l]) mod 12345678;
            end;
      f:=g;
    end;
  ans:=0;
  for i:=-p to 0 do
    for j:=i to i+p do ans:=(ans+f[n,i,j]) mod 12345678;
  write(ans);
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值