C - Matrix Reducing

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 1h2h110

1 ⩽ w 2 ⩽ w 1 ⩽ 10 1 \leqslant w2 \leqslant w1 \leqslant 10 1w2w110

思路

数据范围很小,可以采用二进制枚举。假如对于行而言一个二进制数
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 2h12w1h2w2

/*
二进制枚举
*/
#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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值