CodeForces 118D Caesar's Legions :n1种步兵n2种马兵,询问多少种排列方式使不超过k1种步兵相连k2种马兵相连 :dp
dp[i][j]表示前面i个步兵j个马兵排列种数,再枚举一下本次放的步兵和马兵的个数就可以dp了
技巧在于:不是一个一个放兵,而是轮流种类放兵==
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 #define MOD 100000000 6 int dp[105][105][2]; 7 int main() 8 { 9 int n1,n2,k1,k2,i,j,k; 10 scanf("%d%d%d%d",&n1,&n2,&k1,&k2); 11 memset(dp,0,sizeof(dp)); 12 dp[0][0][0]=dp[0][0][1]=1; 13 for (i=0;i<=n1;i++) 14 for (j=0;j<=n2;j++) 15 { 16 for (k=1;k<=i&&k<=k1;k++) 17 dp[i][j][1]=(dp[i][j][1]+dp[i-k][j][0])%MOD; 18 for (k=1;k<=j&&k<=k2;k++) 19 dp[i][j][0]=(dp[i][j][0]+dp[i][j-k][1])%MOD; 20 } 21 printf("%d\n",(dp[n1][n2][0]+dp[n1][n2][1])%MOD); 22 return 0; 23 }