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]表示放的女生,那么就可以转移了。
原题传送门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.
相关文章推荐
- [bzoj1037][DP]生日聚会party
- BZOJ 1037 生日聚会 DP
- bzoj 1037: [ZJOI2008]生日聚会Party (DP)
- BZOJ 1037 生日聚会 DP
- bzoj1037(dp 1A)
- BZOJ 1037: [ZJOI2008]生日聚会Party( dp )
- HYSBZ/BZOJ 1037 [ZJOI2008] 生日聚会Party - dp
- BZOJ 1037: [ZJOI2008]生日聚会Party [序列DP]
- 【BZOJ1037】[ZJOI2008]生日聚会Party【计数DP】【特殊的姿势】
- bzoj 1037 [ZJOI2008]生日聚会Party(DP)
- BZOJ 1037-生日聚会Party(DP)
- bzoj 1037: [ZJOI2008]生日聚会Party dp
- bzoj1037: [ZJOI2008]生日聚会Party DP
- [BZOJ1037][ZJOI2008]生日聚会Party dp
- bzoj1037: [ZJOI2008]生日聚会Party(dp)
- BZOJ 1037: [ZJOI2008]生日聚会Party(区间dp)
- bzoj1037 [ZJOI2008]生日聚会Party(dp)
- 【bzoj 1037】生日聚会Party(DP)
- [bzoj1037][ZJOI2008]生日聚会Party dp
- BZOJ 1037: [ZJOI2008]生日聚会Party DP