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

 

你可能感兴趣的:(VJP1193 扫雷(状压))