2011年12月21日
摘要: UVA_185 第一部分就不详细说了,把字符串翻译成整数即可,关键在于第二部分,这个就像小的时候玩的填数字的数学题。 首先,我们不妨分析一下题目的特征,并试图找尽量多的回溯的条件。 显然我们应该从个位加和算起,这样既符合我们的运算习惯,也方便我们对表达式求值。我们不妨设对竖式的每一列的分析都是x+y+s=z的形式,其中s为前一位进上来的余数,那么我们当然选择去枚举x和y的值,这样z就自然确定了,如果枚举z的值话就显得麻烦多了。 在枚举x和y的时候都会遇到三种情况,第一种情况是这个字符在前面的运算中已被赋了一个值了,第二种情况是这个字符还没有被赋过值,第三种情况就是不存在这一位(说道这里... 阅读全文
posted @ 2011-12-21 19:35 Staginner 阅读(614) 评论(0) 推荐(0) 编辑
摘要: UVA_10160 这个题目我改下一下Dancing Links的算法,没想到搜过去了,只不过时间花的比较多。 由于原本Dancing Links是解决精确覆盖问题的,而这个问题是可以重复覆盖的,所以要把Dancing Links的删除和恢复的操作改变一下。 当然,还有更高效的搜索方式,可以google一下。#include<stdio.h>#include<string.h>#define INF 0x3f3f3f3fconst int MAXN = 40;const int MAXD = MAXN * MAXN + MAXN;int U[MAXD], D[MAXD] 阅读全文
posted @ 2011-12-21 14:46 Staginner 阅读(574) 评论(0) 推荐(0) 编辑
摘要: UVA_10123 以下斜体部分是我第一次写的解题报告,但后来越来越觉得我实现的程序和我的想法并不怎么挂钩,于是就越发怀疑程序里那个剪枝的正确性了。 再后来看了UVA的论坛之后,发现上面有人提到用记忆化搜索去解,我这时再一看N只有20,完全可以用状态压缩+记忆化搜索来做,只是当时没有想到,其中一部分原因也是觉得LRJ放在了回溯这章里面,就压根没向着dp的方向去考虑,一直在想怎么剪枝去了,便也凑巧,居然诞生了下面的我现在也不知道正确与否的回溯做法。以后千万不要局限于已知的这题的归类,换个思路也许就能海阔天空了。 如果各位兄台谁有兴趣证明出了或者推翻了下面这个回溯的程序,还望能和小弟分享一下... 阅读全文
posted @ 2011-12-21 01:11 Staginner 阅读(845) 评论(1) 推荐(0) 编辑