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 }
View Code

题目链接:http://codeforces.com/problemset/problem/118/D

posted on 2015-03-26 17:33  xiao_xin  阅读(227)  评论(0编辑  收藏  举报

导航