题目链接: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 }