题目链接:
题目描述:
给出n个小球,每个小球只能涂黑色或者是白色,七个连续的不能是同种颜色,问有多少种涂色方法?
解题思路:
刚开始没有考虑到是环形的,WA的风生水起,怪我咯!怪我咯!最后看到是环形的,然后就考虑去除环的影响。
先设定起始位置小球颜色为0(白色), (1-->黑色),考虑可知起始位置小球颜色为1的方案数目与设定方案相同,所以算出任意一种,乘上2就是答案。
dp[a][x][y] 代表 a-->前a个小球颜色都为0, x-->第i位置小球的颜色, y-->当前位置为y, dp[x][y]-->当前状态的摆放方案数目。第一维与后面的两维是独立的,没有什么因果关系,讷,现在我们把第一维删掉,然后对后面两维循环6次即可。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 100010; 8 const int mod = 2015; 9 int dp[2][maxn]; 10 11 int main () 12 { 13 int T, n; 14 scanf ("%d", &T); 15 for (int t=1; t<=T; t++) 16 { 17 scanf ("%d", &n); 18 int ans = 0; 19 for (int start=1; start<7; start++) 20 { 21 memset (dp, 0, sizeof(dp)); 22 dp[0][start] = 1; 23 for (int i=start+1; i<=n; i++) 24 { 25 for (int j=0; j<2; j++) 26 { 27 if (i==n && j == 0) 28 { 29 for (int k=1; k<=6-start; k++) 30 if (i > k) 31 dp[j][i] += dp[1-j][i-k]; 32 dp[j][i] = dp[j][i] % mod; 33 } 34 else 35 { 36 for (int k=1; k<=6; k++) 37 if (i > k) 38 dp[j][i] += dp[1-j][i-k]; 39 dp[j][i] = dp[j][i] % mod; 40 } 41 } 42 } 43 ans = (ans + dp[0][n] + dp[1][n]) % mod; 44 } 45 printf ("Case #%d: %d ", t, (ans * 2) % mod); 46 } 47 return 0; 48 }