网格中的有效方法
Efficient approach in the grid
问题:我们必须用集合S中的字符填充大小为m*n的二维网格,使得生成的网格中不同的子矩阵的数量接近给定的数字k。
这个问题来源于http://www.codechef.com/JULY14/problems/GERALD09
限制:
1 & lt; = n, m<16
1<=k <=m*n*m*n
S | | = 4
时间限制=0.1秒
假设:如果两个子矩阵不具有相同的维数,或者至少有一对对应位置的字符不匹配,则它们是不同的。
我的方法:我们可以从随机网格和循环开始,同时找到可接受的解决方案,在每次迭代中,我们可以根据当前状态增加/减少随机性(但我们可以停留在局部最优状态)。
但问题是我不知道有效的方法来计算子网格中不同子矩阵的数量。我尝试了哈希计数,它非常快(O(n2m2)*为子网格生成/搜索哈希值的成本)。但是由于哈希值的冲突,这种方法不能给出确切的答案,即使在使用@Vaughn Cato的评论纠正它之后,我也可以进行15-25次迭代来寻找最佳状态,这还不够。
最近,我了解到模拟退火可以用来解决这类问题。
http://www.theprojectspot.com/tutorial-post/simulated-annealing-algorithm-for-beginners/6
我正在寻找解决这个优化问题的有效方法。
我想他们会在某个时候发表一篇社论,但对于这个特殊的问题,这里有一个可能的想法:
我局部生成了特定n
和m
的所有可能的子矩阵数。对于n=m=3
,我从81
中只得到11
。对于n=3,m=4
,我从可能的144
值中只得到19
。更重要的是,当我生成这些值时,我一开始就获得了所有19
可能的选项——在263000
矩阵从可能的16M
矩阵中剔除之后,我已经拥有了它们。(按字典顺序生成)
因此,我认为,一个可能的解决方案可能是预先计算尽可能多的K
的不同值,可以为给定的n
和m
实现,保存随机生成器的种子或以其他方式,例如每个n-m-k
三元组需要O(1)
个字符,对于特定的测试用例,只需检查两个相邻的值-首先k
大于和小于给定。
更重要的是,由于K
的可能值并不多,也可以用其他方式生成:给定nxm
表的K
的所有可能值,以及相应的表,我们只能通过下一行的值进行回溯,并尝试获得nx(m+1)
表的K
的所有不同值的所有可能矩阵。
- 有哪些有效的方法可以消除一组 100 万个字符串>重复数据?
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 找到一种有效的方法,在 2 个巨大的缓冲区上执行 MAX,每字节字节
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 比较C++中两个整数的最有效和最干净的方法是什么?
- 比较C++变量的最有效方法
- C++函子,有什么有效的方法吗?
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 证明两指针方法有效(对和)
- leetcode中的最大数字:有人能解释为什么这个方法有效吗
- C++ 用指针反向打印数组内容 - 为什么此方法有效
- Makefile:为什么这种自动生成先决条件的方法有效
- g++链接错误-解决方法有效的原因