rt,f[a][b][x][y]
表示队伍里面一共有 a 个步兵、b 个骑兵、以 x 个步兵结
尾、以 y 个骑兵结尾的方案数。
code
#include<bits/stdc++.h>
#define reg register int
#define INF (1<<30)
#define int long long
using namespace std;
int read(){
int res=0,fs=1; char c=getchar();
while(!(c>='0' && c<='9')){ if(c=='-')fs=-1; c=getchar(); }
while(c>='0' && c<='9')res=res*10+c-'0',c=getchar();
return res*fs;
}
void print(int x){
if(x<0) { putchar('-'); x=-x;}
if(x>9) print(x/10);
putchar(x%10+'0');
}
int n,cnt,m,a[5010],ans,tmp,k;
int f[105][105][12][12];
const int mod=1e8;
signed main() {
ios::sync_with_stdio(false);
int a,b,c,d;
cin>>a>>b>>c>>d;
f[0][0][0][0]=1;
// f[0][1][0][1]=1;
// f[1][0][1][0]=1;
for(int i=0;i<=1;i++) for(int j=0;j<=1-i;j++) f[0][1][i][j]=(c>=1),f[1][0][i][j]=(d>=1);
for(int i=1;i<=a;i++){
for(int j=1;j<=b;j++){
for(int k=0;k<=c;k++){
for(int l=0;l<=d;l++){
// if(i==0&&j==0&&k==0&&l==0) continue;
ans=0;
if(k==0&&l==1){
for(int ccf=1;ccf<=min(c,i);ccf++) ans+=f[i][j-1][ccf][0];
ans%=mod;
}else if(k==1&&l==0){
for(int ccf=1;ccf<=min(d,j);ccf++) ans+=f[i-1][j][0][ccf];
ans%=mod;
}
else if(k>1) ans+=f[i-1][j][k-1][l];
else if(l>1) ans+=f[i][j-1][k][l-1];
// if(k==c) ans+=f[]
f[i][j][k][l]+=ans%mod;
f[i][j][k][l]%=mod;
// cout<<f[i][j][k][l]<<endl;
}
}
}
}
ans=0;
for(int i=0;i<=c;i++) ans+=f[a][b][i][0];
for(int i=0;i<=d;i++) ans+=f[a][b][0][i];
// for(int i=0;i<=c;i++) for(int j=0;j<=d;j++) ans+=f[a][b][i][j],ans%=mod;
cout<<ans;
return 0;
}