BZOJ1037 DP

2013-11-15 21:51

原题传送门http://www.lydsy.com/JudgeOnline/problem.php?id=1037

拿到这道题想到了DP,后来发现三维无法确定的表示状态(起码我是表示不出来)

然后就用四维表示状态,w[i,j,k1,k2]表示一共i个人,j个男生,前i-1个人中任意一个人到第i个人的区间里,男生比女生最多多k1个人且存在k1的情况,

女生比男生最多多k2个人且存在k2的情况

那么w[i,j,k1,k2]这个状态可以更新w[i+1,j+1,k1+1,max(k2-1,0)]表示第i+1个位置放的男生,w[i+1,j,max(k1-1),k2+1]表示放的女生,那么就可以转移了。

//By BLADEVIL

const 

d39     =12345678;



var

    n, m, k     :longint;

    i, j, k1, k2     :longint;

    w     :array[0..310,0..160,0..20,0..20] of longint;

    ans     :longint;

function max(a,b:longint):longint;

begin

    if a>b then max:=a else max:=b;

end;

begin

    read(n,m,k);

    w[1,1,1,0]:=1;

    w[1,0,0,1]:=1;

    for i:=1 to n+m-1 do 

        for j:=0 to i do 

            for k1:=0 to k do 

                for k2:=0 to k do 

                begin

                         if w[i,j,k1,k2]=0 then continue;

                         if (k1<k) and (j<n) then 

                                 w[i+1,j+1,k1+1,max(k2-1,0)]:=(w[i+1,j+1,k1+1,max(k2-1,0)]+w[i,j,k1,k2]) mod d39;

                         if (k2<k) and (i-j<m) then 

                             w[i+1,j,max(k1-1,0),k2+1]:=(w[i+1,j,max(k1-1,0),k2+1]+w[i,j,k1,k2]) mod d39;

                end;

    ans:=0;

    for i:=0 to k do 

        for j:=0 to k do ans:=(ans+w[n+m,n,i,j]) mod d39;

    writeln(ans);

end.

 

你可能感兴趣的:(ZOJ)