freee Programming Contest 2022(AtCoder Beginner Contest 264)
C - Matrix Reducing
题意
给你一个长和宽为 h 1 , w 1 h1, w1 h1,w1的二维数组 a a a,和一个长和宽为 h 2 , w 2 h2, w2 h2,w2的二维数组 b b b,问你能否删除 a a a数组中的一些行和列使得 a = b a = b a=b。
数据范围
1 ⩽ h 2 ⩽ h 1 ⩽ 10 1 \leqslant h2 \leqslant h1 \leqslant 10 1⩽h2⩽h1⩽10
1 ⩽ w 2 ⩽ w 1 ⩽ 10 1 \leqslant w2 \leqslant w1 \leqslant 10 1⩽w2⩽w1⩽10
思路
数据范围很小,可以采用二进制枚举。假如对于行而言一个二进制数
100001000
100001000
100001000
则表示第
4
4
4行和第
9
9
9行删除,其余行保留。列也同理。
时间复杂度
2
h
1
∗
2
w
1
∗
h
2
∗
w
2
2 ^ {h_1} * 2 ^{w_1} * h_2 * w_2
2h1∗2w1∗h2∗w2
/*
二进制枚举
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 15;
int h1, h2, w1, w2;
int a[N][N], b[N][N];
int main(){
cin >> h1 >> w1;
for(int i = 1; i <= h1; i ++ ) for(int j = 1; j <= w1; j ++ ) cin >> a[i][j];
cin >> h2 >> w2;
for(int i = 1; i <= h2; i ++ ) for(int j = 1; j <= w2; j ++ ) cin >> b[i][j];
for(int i = 0; i < (1 << h1); i ++ ){
for(int j = 0; j < (1 << w1); j ++ ){
vector<int>x,y;
for(int k = 1; k <= h1; k ++ ) if(i & (1 << (k - 1))) x.push_back(k);
for(int k = 1; k <= w1; k ++ ) if(j & (1 << (k - 1))) y.push_back(k);
if(x.size() != h2 || y.size() != w2) continue;
bool match = true;
for(int k = 1; k <= h2; k ++ ){
for(int l = 1; l <= w2; l ++ ){
if(a[x[k - 1]][y[l - 1]] != b[k][l]){
match = false;
break;
}
}
}
if(match){
puts("Yes");
return 0;
}
}
}
puts("No");
return 0;
}