uva1592

这是一篇关于解决UVA1592问题的博客,主要讨论如何找到矩阵中存在相同行向量的2x2子矩阵。文章指出,简单的暴力枚举会超时,提出将字符串映射为整数并枚举列,利用map存储行向量的策略来优化解决方案。
摘要由CSDN通过智能技术生成

题目链接
题意大意:
输入一个n*m的数据矩阵 A,问是否存在这两个不同的行 r1 和 r2 及两个不同的 c1 和 c2,使得以下的关系成立:
A(r1,c1) = A(r2,c1) && A(r1,c2) = A(r2,c2)
如果存在,第一行输出 NO,第二行输出 r1 , r2 ;第三行输出c1, c2
不存在,直接输出 YES

题目分析:

  1. 暴力枚举r1,r2,c1,c2会超时。
  2. 题目实际上要找的就是一个2×2的子阵,该子阵的第一行的行向量和第二行的行向量相等。
  3. 可以将原问题中矩阵的每一个元素(即一段字符串)映射到整数,然后只枚举c1和c2,然后扫描各行,判断是否有两个相等的行向量。
  4. 此处为2维行向量,故可以用pair来表示这个行向量,并且将每一行的行向量与对应的行号做一个映射(使用map)。

代码实现:

#include <iostream>
#include <string>
#include <map>
#include <vector>
using namespace std;

typedef pair<int,int > PII;
const int maxr = 10000+10;	// 行数最大值 
const int maxc = 10+10;		// 列数最大值 

int row,col,id,dp
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值