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 }