1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #include<algorithm> 5 #define MAXN 160 6 #define MAXM 20 7 #define MAXL 280 8 using namespace std; 9 int n,m; 10 bool land[MAXN][MAXM]; 11 int put[MAXL][MAXM],cnt[MAXL],tmp[MAXM],size; 12 vector<int>G[MAXL]; 13 int dp[2][MAXL][MAXL]; 14 bool OK() 15 { 16 int i,j,k,res; 17 for(i=res=0;i<m;i++) 18 { 19 if(tmp[i]) 20 { 21 for(j=i;j<m&&tmp[i]==tmp[j];j++); 22 k=j-i; 23 if(tmp[i]==1) 24 { 25 if(k%3) 26 return false; 27 res+=k/3; 28 } 29 else 30 { 31 if(k&1) 32 return false; 33 res+=k>>1; 34 } 35 i=j-1; 36 } 37 } 38 cnt[size]=res; 39 return true; 40 } 41 void DFS(int now) 42 { 43 if(now==m) 44 { 45 if(OK()) 46 memcpy(put[size++],tmp,sizeof(tmp)); 47 } 48 else 49 { 50 int i; 51 for(i=0;i<3;i++) 52 { 53 tmp[now]=i; 54 DFS(now+1); 55 } 56 } 57 } 58 bool Upper(int x,int y) 59 { 60 int i; 61 for(i=0;i<m;i++) 62 { 63 if(put[x][i]&&put[y][i]) 64 return false; 65 } 66 return true; 67 } 68 void Init() 69 { 70 int i,j; 71 size=0; 72 memset(land,false,sizeof(land)); 73 memset(dp,0,sizeof(dp)); 74 DFS(0); 75 for(i=0;i<size;i++) 76 { 77 G[i].clear(); 78 for(j=0;j<size;j++) 79 { 80 if(Upper(i,j)) 81 G[i].push_back(j); 82 } 83 } 84 } 85 bool Unfit(int r,int x) 86 { 87 int i; 88 for(i=0;i<m;i++) 89 { 90 if(land[r][i]&&put[x][i]) 91 return true; 92 } 93 return false; 94 } 95 bool First(int x) 96 { 97 int i; 98 for(i=0;i<m;i++) 99 { 100 if(put[x][i]==2||put[x][i]&&land[1][i]) 101 return true; 102 } 103 return false; 104 } 105 bool Three(int x,int y,int k) 106 { 107 int i; 108 for(i=0;i<m;i++) 109 { 110 if(put[x][i]==2) 111 { 112 if(put[y][i]||land[k][i]) 113 return true; 114 } 115 } 116 return false; 117 } 118 void DoIt() 119 { 120 int i,j,k,t,x,y,ans; 121 for(ans=i=0;i<size;i++) 122 { 123 if(Unfit(2,i)||First(i)) 124 continue; 125 dp[0][i][0]=cnt[i]; 126 } 127 for(i=3;i<=n;i++) 128 { 129 for(j=0;j<size;j++) 130 { 131 if(Unfit(i,j)) 132 continue; 133 for(k=0;k<G[j].size();k++) 134 { 135 x=G[j][k]; 136 if(Unfit(i-1,x)||Unfit(i-1,j)) 137 continue; 138 for(t=0;t<G[x].size();t++) 139 { 140 y=G[x][t]; 141 if(Unfit(i-2,y)||Unfit(i-2,x)||Three(j,y,i-2)) 142 continue; 143 dp[i&1][j][x]=max(dp[i&1][j][x],dp[(i-1)&1][x][y]+cnt[j]); 144 } 145 ans=max(ans,dp[i&1][j][x]); 146 } 147 } 148 } 149 printf("%d\n",ans); 150 } 151 int main() 152 { 153 int c,q,x,y; 154 scanf("%d",&c); 155 while(c--) 156 { 157 scanf("%d%d%d",&n,&m,&q); 158 Init(); 159 while(q--) 160 { 161 scanf("%d%d",&x,&y); 162 land[x][y-1]=true; 163 } 164 DoIt(); 165 } 166 return 0; 167 }
![](https://img2024.cnblogs.com/blog/35695/202408/35695-20240826070647288-243310440.jpg)