题目链接
使用状态dp[i][j][k],i,j:步兵,骑兵个数 k:0是步兵,1是骑兵
状态方程:for(int k = 1; k <= min(i,k1); k++)
dp[i][j][0] = (dp[i][j][0] + dp[i-k][j][1])%MOD;
for(int k = 1; k <= min(j,k2); k++)
dp[i][j][1] = (dp[i][j][1] + dp[i][j-k][0])%MOD;
类似于zoj3747
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n1,n2,k1,k2;
int dp[220][220][2];
#define MOD 100000000
//dp[i][j][k]已经用了i个步兵j个骑兵,k为0是步兵k为1是骑兵
int main()
{
//freopen("in.txt","r",stdin);
int i,j,k;
while(~scanf("%d%d%d%d",&n1,&n2,&k1,&k2))
{
memset(dp,0,sizeof(dp));
for(i=0;i<=k1;i++)
dp[i][0][0]=1;
for(i=0;i<=k2;i++)
dp[0][i][1]=1;
for(i=1;i<=n1;i++)
for(j=1;j<=n2;j++)
{
for(k=1;k<=min(i,k1);k++)
dp[i][j][0]=(dp[i][j][0]+dp[i-k][j][1])%MOD;
for(k=1;k<=min(j,k2);k++)
dp[i][j][1]=(dp[i][j][1]+dp[i][j-k][0])%MOD;
}
printf("%d\n",(dp[n1][n2][0]+dp[n1][n2][1])%MOD);
}
return 0;
}