题目大意:
有
K
个
N?M
的
01
矩阵
(1<=N,M<=10,2<=K<=6)
,保证两两不同,然后要你从
N?M
矩阵中选出最少的位置,使得仅靠这些位置就能区分这
K
个矩阵。
解题思路:
我们观察到
K
的范围,发现如果我们将所有矩阵两两是否可以区分的信息存储下来需要的空间是
2K?(K?1)2
,是可以承受的,然后我们逐格
dp
,
F[i][j][G]
表示考虑到了第
(i,j)
并且区分状态是
G
时所需的最小的选取数,然后我们可以预处理出对于选取
(i,j)
可以区分那几对矩阵。
所以最后的答案就是
F[N][M][2K?(K?1)2?1]
。
AC代码:
#include
#include
#include
#include
#include
#include
using namespace std; int N,M; int K; int ch[10][20][20]={{{0}}}; int change[20][20]={{0}}; int F[33000]={0}; bool Matrix[33000][11][11]={{{0}}}; int need[20][20]={{0}}; int main() { scanf("%d%d%d",&N,&M,&K); for(int i=1;i<=K;i++) for(int p=1;p<=N;p++) for(int q=1;q<=M;q++) { scanf("%1d",&ch[i][p][q]); for(int j=1;j
=0;p--) { if(change[i][j]==0) continue; if(F[p]+1