VJP1193 扫雷(状压)

链接

保存当前行和前一行两行的状态 

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 using namespace std;
 7 #define N 10010
 8 int a[N],dp[4][4][N],d[4]={0,1,1,2};
 9 int main()
10 {
11     int i,j,k,n,g;
12     while(scanf("%d",&n)!=EOF)
13     {
14         memset(dp,0,sizeof(dp));
15         for(i = 1; i <= n ; i++)
16         scanf("%d",&a[i]);
17         if(n==1)
18         {
19             printf("1\n");
20             continue;
21         }
22         for(i = 0 ; i <= 1 ; i++)
23         {
24             for(j = 0; j <= 1 ; j++)
25             if(i+j==a[1])
26             dp[i][j][2] = 1;
27         }
28         for(i =3 ; i <= n ; i++)
29         {
30             for(j = 0 ; j < 2 ; j++)
31             {
32                 if(j>a[i]||j>a[i-1])
33                 continue;
34                 for(g = 0 ; g < 2 ; g++)
35                 {
36                     if(j+g>a[i]||j+g>a[i-1])
37                     continue;
38                     for(int e = 0 ; e < 2 ; e++)
39                     {
40                         if(j+g+e==a[i-1])
41                         dp[j][g][i] += dp[g][e][i-1];
42                     }
43                 }
44             }
45         }
46         int ans=0;
47         for(i = 0 ; i < 2 ; i++)
48             for(j = 0 ; j < 2 ; j++)
49             if(i+j==a[n])
50             ans+=dp[i][j][n];
51         printf("%d\n",ans);
52     }
53     return 0;
54 }
View Code

 

posted @ 2013-08-19 15:06  _雨  阅读(213)  评论(0编辑  收藏  举报