BZOJ1088: [SCOI2005]扫雷Mine

时间:2021-07-27 20:16:26

这道题A的好莫名其妙啊2333

传送门

状压DP,枚举上一个雷的分布情况(1<<3)-1,然后和当前的分布相结合,推出下一状态。

 //BZOJ 1088
 //by Cydiater
 //2016.8.26
 #include <iostream>
 #include <cstring>
 #include <string>
 #include <algorithm>
 #include <cmath>
 #include <ctime>
 #include <cstdlib>
 #include <queue>
 #include <map>
 #include <iomanip>
 #include <cstdio>
 using namespace std;
 #define ll long long
 #define up(i,j,n)       for(ll i=j;i<=n;i++)
 #define down(i,j,n)     for(ll i=j;i>=n;i--)
 ;
 const int oo=0x3f3f3f3f;
 inline ll read(){
       ,f=;
       ;ch=getchar();}
       +ch-';ch=getchar();}
       return x*f;
 }
 ll N,a[MAXN],f[MAXN][<<],ans=;
 namespace solution{
       inline ll col(ll num){
             ;
             <<))cnt++;
             <<))cnt++;
             return cnt;
       }
       void init(){
             N=read();
             up(i,,N)a[i]=read();
       }
       void dp(){
             memset(f,,sizeof(f));
             f[][]=;f[][]=;
             up(i,,N)up(S,,(<<)-)][S]>){
                   int tmp=col(S);
                   )f[i][S>>]+=f[i-][S];
                   &&i<N)f[i][(S>>)|(<<)]+=f[i-][S];
             }
       }
       void output(){
             up(i,,(<<)-)ans+=f[N][i];
             cout<<ans<<endl;
       }
 }
 int main(){
       //freopen("input.in","r",stdin);
       using namespace solution;
       init();
       dp();
       output();
       ;
 }