正题
这题没做过的应该想不到这样的Dp。
我们考虑到通过枚举当前位置是男生还是女生来进行暴搜的。
想一想通过什么完整地记录下当前的状态。
我们设为前i个人,用了j个男生,末尾任意个人中男生与女生差值最大为p,女生与男生差值最大为q的方案数。
注意,这里设置的是“末尾任意个人中“。
先说一下转移方程,,
。
为什么?要减一,因为我们不考虑前面任意个的影响,前面的满足条件才会转移到这一步。
所以我们只需要考虑好当下的末尾的差值变化就可以了。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,k;
int f[310][160][25][25];
const int mod=12345678;
int main(){
scanf("%d %d %d",&n,&m,&k);
f[0][0][0][0]=1;
for(int i=0;i<n+m;i++)
for(int j=0;j<=n;j++)
for(int p=0;p<=k;p++)
for(int q=0;q<=k;q++) if(f[i][j][p][q]){
if(j+1<=n && p+1<=k) (f[i+1][j+1][p+1][max(q-1,0)]+=f[i][j][p][q])%=mod;
if(q+1<=k) (f[i+1][j][max(p-1,0)][q+1]+=f[i][j][p][q])%=mod;
}
int ans=0;
for(int i=0;i<=k;i++)
for(int j=0;j<=k;j++)
(ans+=f[n+m][n][i][j])%=mod;
printf("%d\n",ans);
}