fzu 2204 7 dp

题目链接:

  fzu 2204 7

题目描述:

  给出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 }
本文为博主原创文章,未经博主允许不得转载。
原文地址:https://www.cnblogs.com/alihenaixiao/p/4861586.html