LA 4123 Glenbow Museum
还是递推的题。要观察出R比O多4个这个事实,同时不能有两个以上的连续的O,然后就是dp,dp[i][j][k]表示目前为止有i个R,连续的R有j个,第一个字母为O的时候是1,R的时候是0,最后一个字母总是R。
代码如下:
1 #include <cstdio> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstring> 5 6 using namespace std; 7 8 typedef long long LL; 9 const int N = 1111; 10 LL dp[N][5][2]; // N - num of 'R', continueous 'R' pair, first letter 11 12 void PRE() { 13 dp[1][0][0] = dp[1][0][1] = 1; 14 for (int i = 2; i < N; i++) { 15 for (int j = 0; j < 5; j++) { 16 for (int k = 0; k < 2; k++) { 17 if (j) dp[i][j][k] += dp[i - 1][j - 1][k]; 18 dp[i][j][k] += dp[i - 1][j][k]; 19 //cout << i << ' ' << j << ' ' << k << ' ' << dp[i][j][k] << endl; 20 } 21 } 22 } 23 } 24 25 int main() { 26 PRE(); 27 int n, cas = 1; 28 while (cin >> n && n) { 29 printf("Case %d: %lld\n", cas++, n & 1 ? 0 : dp[(n + 4) >> 1][3][0] + dp[(n + 4) >> 1][4][0] + dp[(n + 4) >> 1][4][1]); 30 } 31 return 0; 32 }
还是不太懂怎么递推,继续。
——written by Lyon