Guest User

Untitled

a guest
Oct 13th, 2024
503
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.18 KB | None | 0 0
  1. #include <vector>
  2. #include <list>
  3. #include <map>
  4. #include <set>
  5. #include <deque>
  6. #include <vector>
  7. #include <list>
  8. #include <map>
  9. #include <set>
  10. #include <deque>
  11. #include <queue>
  12. #include <stack>
  13. #include <bitset>
  14. #include <algorithm>
  15. #include <functional>
  16. #include <numeric>
  17. #include <utility>
  18. #include <sstream>
  19. #include <iostream>
  20. #include <iomanip>
  21. #include <cstdio>
  22. #include <cmath>
  23. #include <cstdlib>
  24. #include <cctype>
  25. #include <string>
  26. #include <cstring>
  27. #include <ctime>
  28. #include <random>
  29. #include <chrono>
  30.  
  31. using namespace std;
  32.  
  33. #define _int64 long long
  34. #define mo 998244353
  35.  
  36. int a[3][110];
  37. int d[110][1<<9];
  38.  
  39. int getv(int i,int bit)
  40. {
  41.     int x,y;
  42.     x=bit%3;
  43.     y=i-3+bit/3;
  44.     return a[x][y];
  45. }
  46.  
  47. void doit(int i,int j,int bit1,int bit2,int bit3)
  48. {
  49.     int cnt,tmp;
  50.     if ((j&(1<<bit1))!=0) return;
  51.     if ((j&(1<<bit2))!=0) return;
  52.     if ((j&(1<<bit3))!=0) return;
  53.     tmp=d[i][j];
  54.     cnt=0;
  55.     if (getv(i,bit1)==0) cnt++;
  56.     if (getv(i,bit2)==0) cnt++;
  57.     if (getv(i,bit3)==0) cnt++;
  58.     if (cnt>=2) tmp++;
  59.     d[i][j|(1<<bit1)|(1<<bit2)|(1<<bit3)]=max(d[i][j|(1<<bit1)|(1<<bit2)|(1<<bit3)],tmp);
  60. }
  61.  
  62. int main()
  63. {
  64.     int i,j,k,n,l,t,m,x,y,o,b1,ans;
  65.     scanf("%d",&t);
  66.     for (l=0;l<t;l++)
  67.     {
  68.         scanf("%d",&n);
  69.         for (i=0;i<3;i++)
  70.             for (j=0;j<n;j++)
  71.                 scanf("%d",&a[i][j]);
  72.         for (i=0;i<=n+2;i++)
  73.             for (j=0;j<(1<<9);j++)
  74.                 d[i][j]=-(1<<30);
  75.         d[0][(1<<9)-1]=0;
  76.         for (i=0;i<=n+2;i++)
  77.         {
  78.             for (j=0;j<(1<<9);j++)
  79.             {
  80.                 if (d[i][j]==-(1<<30)) continue;
  81.                 //cerr<<"d:"<<i<<" "<<j<<" "<<d[i][j]<<endl;
  82.                 if ((j&1)==0)
  83.                 {
  84.                     doit(i,j,0,3,6);
  85.                     doit(i,j,0,3,4);
  86.                     doit(i,j,0,1,4);
  87.                     doit(i,j,0,1,2);
  88.                     doit(i,j,0,1,3);
  89.                 }
  90.                 else if ((j&2)==0)
  91.                 {
  92.                     doit(i,j,1,4,3);
  93.                     doit(i,j,1,4,7);
  94.                     doit(i,j,1,4,5);
  95.                     doit(i,j,1,2,5);
  96.                     doit(i,j,1,2,4);
  97.  
  98.                 }
  99.                 else if ((j&4)==0)
  100.                 {
  101.                     doit(i,j,2,5,4);
  102.                     doit(i,j,2,5,8);
  103.                 }
  104.                 else
  105.                 {
  106.                     if (i+1<=n)
  107.                         d[i+1][(j>>3)]=max(d[i+1][(j>>3)],d[i][j]);
  108.                     else if (i+1<=n+2)
  109.                         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]);
  110.  
  111.                 }
  112.             }
  113.         }
  114.         ans=d[n+2][(1<<9)-1];
  115.         printf("%d\n",ans);
  116.     }
  117. }
Advertisement
Add Comment
Please, Sign In to add comment