bzoj 1037: [ZJOI2008]生日聚会Party (dp)

本文通过一个具体的DP算法实例,展示了如何使用动态规划解决一类特定的问题。文章详细解释了状态定义、状态转移方程,并提供了完整的Pascal代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dp,但是要顺推容易点

 

const
  mm=12345678;
var
  f:array[0..1,0..200,0..20,0..20]of longint;
  n,m,kk,now,sum,i,j,k1,k2:longint;
 
function max(x,y:longint):longint;
begin
  if x<y then exit(y);
  exit(x);
end;
 
begin
  readln(n,m,kk);
  now:=0;
  f[now][1,1,0]:=1;
  f[now][0,0,1]:=1;
  for i:=1 to n+m-1 do begin
    fillchar(f[1-now],sizeof(f[1-now]),0);
    for j:=0 to n do begin
      if (j>i) and (i-j>m) then continue;
      for k1:=0 to kk do
        for k2:=0 to kk do
          if f[now][j,k1,k2]>0 then begin
            if (k1<kk) and (j<n) then begin
              inc(f[1-now][j+1,k1+1,max(k2-1,0)],f[now][j,k1,k2]);
              f[1-now][j+1,k1+1,max(k2-1,0)]:=f[1-now][j+1,k1+1,max(k2-1,0)] mod mm;
            end;
            if (k2<kk) and (i-j<m) then begin
              inc(f[1-now][j,max(k1-1,0),k2+1],f[now][j,k1,k2]);
              f[1-now][j,max(k1-1,0),k2+1]:=f[1-now][j,max(k1-1,0),k2+1] mod mm;
            end;
          end;
    end;
    now:=1-now;
  end;
  sum:=0;
  for i:=0 to kk do
    for j:=0 to kk do
      sum:=(f[now][n,i,j]+sum) mod mm;
  writeln(sum);
end.
View Code

 

转载于:https://www.cnblogs.com/Macaulish/p/4358203.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值