您的位置:首页 > 其它

BZOJ1037 DP

2013-11-20 14:30 148 查看
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.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: