Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <list>
- #include <map>
- #include <set>
- #include <deque>
- #include <vector>
- #include <list>
- #include <map>
- #include <set>
- #include <deque>
- #include <queue>
- #include <stack>
- #include <bitset>
- #include <algorithm>
- #include <functional>
- #include <numeric>
- #include <utility>
- #include <sstream>
- #include <iostream>
- #include <iomanip>
- #include <cstdio>
- #include <cmath>
- #include <cstdlib>
- #include <cctype>
- #include <string>
- #include <cstring>
- #include <ctime>
- #include <random>
- #include <chrono>
- using namespace std;
- #define _int64 long long
- #define mo 998244353
- int a[3][110];
- int d[110][1<<9];
- int getv(int i,int bit)
- {
- int x,y;
- x=bit%3;
- y=i-3+bit/3;
- return a[x][y];
- }
- void doit(int i,int j,int bit1,int bit2,int bit3)
- {
- int cnt,tmp;
- if ((j&(1<<bit1))!=0) return;
- if ((j&(1<<bit2))!=0) return;
- if ((j&(1<<bit3))!=0) return;
- tmp=d[i][j];
- cnt=0;
- if (getv(i,bit1)==0) cnt++;
- if (getv(i,bit2)==0) cnt++;
- if (getv(i,bit3)==0) cnt++;
- if (cnt>=2) tmp++;
- d[i][j|(1<<bit1)|(1<<bit2)|(1<<bit3)]=max(d[i][j|(1<<bit1)|(1<<bit2)|(1<<bit3)],tmp);
- }
- int main()
- {
- int i,j,k,n,l,t,m,x,y,o,b1,ans;
- scanf("%d",&t);
- for (l=0;l<t;l++)
- {
- scanf("%d",&n);
- for (i=0;i<3;i++)
- for (j=0;j<n;j++)
- scanf("%d",&a[i][j]);
- for (i=0;i<=n+2;i++)
- for (j=0;j<(1<<9);j++)
- d[i][j]=-(1<<30);
- d[0][(1<<9)-1]=0;
- for (i=0;i<=n+2;i++)
- {
- for (j=0;j<(1<<9);j++)
- {
- if (d[i][j]==-(1<<30)) continue;
- //cerr<<"d:"<<i<<" "<<j<<" "<<d[i][j]<<endl;
- if ((j&1)==0)
- {
- doit(i,j,0,3,6);
- doit(i,j,0,3,4);
- doit(i,j,0,1,4);
- doit(i,j,0,1,2);
- doit(i,j,0,1,3);
- }
- else if ((j&2)==0)
- {
- doit(i,j,1,4,3);
- doit(i,j,1,4,7);
- doit(i,j,1,4,5);
- doit(i,j,1,2,5);
- doit(i,j,1,2,4);
- }
- else if ((j&4)==0)
- {
- doit(i,j,2,5,4);
- doit(i,j,2,5,8);
- }
- else
- {
- if (i+1<=n)
- d[i+1][(j>>3)]=max(d[i+1][(j>>3)],d[i][j]);
- else if (i+1<=n+2)
- d[i+1][(j>>3)|(1<<6)|(1<<7)|(1<<8)]=max(d[i+1][(j>>3)|(1<<6)|(1<<7)|(1<<8)],d[i][j]);
- }
- }
- }
- ans=d[n+2][(1<<9)-1];
- printf("%d\n",ans);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment