Codeforces 118 D. Caesar's Legions (dp)

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

有n个步兵和m个骑兵要排成一排,其中连续的步兵不能超过k1个,连续的骑兵不能超过k2个。

dp[i][j][x][y]表示表示用i个步兵和j个骑兵,末尾有连续的x个步兵,或者有连续的y个骑兵。

所以x > 0 && y > 0的情况不存在。三个for就好了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 LL mod = 1e8;
 5 LL dp[105][105][12][12];
 6 int main()
 7 {
 8     int n, m, k1, k2;
 9     cin >> n >> m >> k1 >> k2;
10     dp[0][0][0][0] = 1;
11     for(int i = 0; i <= n; ++i) {
12         for(int j = 0; j <= m; ++j) {
13             if(j < m) {
14                 for(int x = 0; x <= k1; ++x) {
15                     dp[i][j + 1][0][1] += dp[i][j][x][0];
16                     dp[i][j + 1][0][1] %= mod;
17                 }
18             }
19             if(i < n) {
20                 for(int x = 0; x <= k2; ++x) {
21                     dp[i + 1][j][1][0] += dp[i][j][0][x];
22                     dp[i + 1][j][1][0] %= mod;
23                 }
24             }
25             if(i < n) {
26                 for(int x = 1; x < k1; ++x) {
27                     dp[i + 1][j][x + 1][0] += dp[i][j][x][0];
28                     dp[i + 1][j][x + 1][0] %= mod;
29                 }
30             }
31             if(j < m) {
32                 for(int x = 1; x < k2; ++x) {
33                     dp[i][j + 1][0][x + 1] += dp[i][j][0][x];
34                     dp[i][j + 1][0][x + 1] %= mod;
35                 }
36             }
37         }
38     }
39     LL ans = 0;
40     for(int i = 1; i <= k1; ++i) {
41         ans = (ans + dp[n][m][i][0]) % mod;
42     }
43     for(int i = 1; i <= k2; ++i) {
44         ans = (ans + dp[n][m][0][i]) % mod;
45     }
46     cout << ans << endl;
47     return 0;
48 }

 

posted @ 2016-09-25 21:20  Recoder  阅读(233)  评论(0编辑  收藏  举报