最近开始做算法题,准备坚持至少一年。解决完问题可能会来记录一下。
嗯,正式开始之前顺便说说今天的上课的一个细节,权当日记:
上计算机网络的时候,我和旁边的同学讨论我原创的一个算法题。
前面的同学:“你们俩能不能别吵了?”
面对这个学巨,我内心非常惭愧。
然后…
他趴在桌上睡着了…睡着了….
好的,废话说完,进入正题,讲讲我吵到前面这位同学睡觉时讨论的那道题。
这个问题是我再思考八皇后的问题时想到的,实际上,我误以为皇后不能斜着走,跟中国象棋中的车一样,结果就成了八皇后问题的弱化版。
在中国象棋棋盘上有10行9列兵线,现在考虑在棋盘上放k<9个车,使他们互相之间不能吃掉对方,问有多少种方法?如果把棋盘改成m×n的呢?
下面是思路:
设
为了避免重复计算,按行为主序排序这m×n个位置。假设选中第一个放车的位置为
剩下k-1个点先从左侧阴影区选p(
至此我们已经可以写出状态转移方程
边界是当
这样,声明一个状态数组,利用动态规划就能解出结果。
上述表达式还可以优化,i和p的遍历的上界还可以更精确。比如注意到要是剩下的k-1个点能放入阴影部分,必须有
上面的问题与下面这个问题完全等价:
集合
按照k车问题的背景很容易想到按行为主序遍历第一个选中位置而进一步计算所有情况。那么同样地,在这种纯数学的表述下,也应该定义一个偏序关系
程序等有空再放吧。