这道题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(); ; }