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.