- 博客(12)
- 收藏
- 关注
原创 POJ1160 P个邮局N个村庄求最短总距离
<br />有意思的一道题,N个一维坐标点上的村庄中选择P个村庄建邮局,要使总距离最短。用DP方法做, 在第0个村庄(升序)到第i个村庄建立j个邮局的最少总距离,是在第0个到第i个任取第j个点,第0个到第k个之间建立j-1个邮局的最少总距离加上在第(k+1)个到第i个村庄建立一个邮局的总距离之和的最小值(用形式化语言描述更清晰)。<br />第i个村庄到第j个村庄建立1个邮局的最小总距离是容易求的。这个邮局应建在(i+j)/2处。假定中点只有一个,即j-i为偶数,不论邮局建在何处,关于中心点
2010-06-28 18:36:00
1419
原创 POJ1160 P个邮局N个村庄求最短总距离
<br />有意思的一道题,N个一维坐标点上的村庄中选择P个村庄建邮局,要使总距离最短。用DP方法做, 在第0个村庄(升序)到第i个村庄建立j个邮局的最少总距离,是在第0个到第i个任取第j个点,第0个到第k个之间建立j-1个邮局的最少总距离加上在第(k+1)个到第i个村庄建立一个邮局的总距离之和的最小值(用形式化语言描述更清晰)。<br />第i个村庄到第j个村庄建立1个邮局的最小总距离是容易求的。这个邮局应建在(i+j)/2处。假定中点只有一个,即j-i为偶数,不论邮局建在何处,关于中心点对称的两个村
2010-06-28 18:32:00
1223
原创 上舍入、下舍入到下一个2的幂
这是两个"地板"和"天花板"函数,但它们舍入到最近的2的整数幂。1.下舍入无分支算法基于右传播最高位。比较有意思的做法:unsigned flp2(unsigned x){ x = x | (x >> 1);//这样最高位就最多占据了两位 x = x | (x >> 2);//最高位最多占据了四位 x = x | (x >> 4);//最高位最多占据了八位 x =
2010-03-26 22:20:00
2170
原创 双向BFS分析
双向BFS可以极大地减少扩展节点个数,不是从o(n)到o(n/2),通常是o(n)到o(sqrt(n))的(如正反搜索树都是k叉树)。单向BFS求出的一定是最短的路径,双向BFS则不一定。双向BFS求出的路径是最短的的充要条件是图中不存在长度为奇数的回路(双向BFS的两个队列都只有两层,画图简单分析可得出这个结论),对于一般的位置移动的状态变化(如限制只能上下前后左右邻近位置移动),不存在奇数
2010-03-14 15:08:00
434
原创 双向BFS分析
双向BFS可以极大地减少扩展节点个数,不是从o(n)到o(n/2),通常是o(n)到o(sqrt(n))的(如正反搜索树都是k叉树)。单向BFS求出的一定是最短的路径,双向BFS则不一定。双向BFS求出的路径是最短的的充要条件是图中不存在长度为奇数的回路(双向BFS的两个队列都只有两层,画图简单分析可得出这个结论),对于一般的位置移动的状态变化(如限制只能上下前后左右邻近位置移动),不存在奇数
2010-03-14 14:53:00
1424
原创 双向BFS分析
双向BFS可以极大地减少扩展节点个数,不是从o(n)到o(n/2)而通常是o(n)到o(sqrt(n))(考虑正反向搜索树都是完全k叉树的情况).单向BFS求出的一般是最短的路径,双向BFS求出的路径不一定是最短的,最短是有条件的。双向BFS求出的路径是最短的充要条件是不存在状态图中不存在长度为奇数的回路(双向BFS的两个队列都只有两层,画图分析可得出结论),对于一般的位置移动的状态变化(如限
2010-03-14 14:12:00
975
原创 有序数组归并
写下这段文字纯粹因为太生疏了。下午花了很多时间写有序数组的归并陷入死胡同,结果是证明了两个数组归并没有辅助数组时不幸的。通常的数组归并,对于大小为m和n的数组,需要m+n的辅助数组,写起来并不复杂。有次面试的时候要求写一个只有n辅助大小的做法。将b数组拷到a数组中,然后在a,b中选小的逐个放入a中。复杂一点,除了省点内存外意义不大,可能效率还降低。以下代码在vs2005下编译运行。#i
2010-02-26 19:50:00
1262
原创 有序数组归并
写下这段文字纯粹因为太生疏了。下午花了很多时间写有序数组的归并陷入死胡同,结果是证明了两个数组归并没有辅助数组时不幸的。通常的数组归并,对于大小为m和n的数组,需要m+n的辅助数组,写起来并不复杂。有次面试的时候要求写一个只有n辅助大小的做法。将b数组拷到a数组中,然后在a,b中选小的逐个放入a中。复杂一点,除了省点内存外意义不大,可能效率还降低。以下代码在vs2005下编译运行。#i
2010-02-26 19:49:00
608
原创 求逆序数
POJ2299 Ultra-sort可以转成求逆序数。如果规模比较小,求逆序数可以用冒泡的方法做,简单。还可以用归并排序做,先分别求左右两部分的逆序数,两部分都排好序后再求两者之间的逆序数。因此求逆序数是归并排序的副产品。与归并排序的主要差别也就在一句ret += (a + m - posa); 没有ac,惭愧。 #include #include using namesp
2010-02-26 19:41:00
281
原创 求逆序数
POJ2299 Ultra-sort可以转成求逆序数。求逆序数可以用冒泡的方法做,但通常用归并排序做,先分别求左右两部分的逆序数,两部分都排好序后再求两者之间的逆序数。因此求逆序数是归并排序的副产品。与归并排序的主要差别也就在一句ret += (a + m - posa); 没有ac,惭愧。 #include #include using namespace std;_
2010-02-26 19:23:00
381
原创 有序数组归并
写下这段文字纯粹因为太生疏了。下午花了很多时间写有序数组的归并陷入死胡同,结果是证明了两个数组归并没有辅助数组时不幸的。通常的数组归并,对于大小为m和n的数组,需要m+n的辅助数组,写起来并不复杂。有次面试的时候要求写一个只有n辅助大小的做法。将b数组拷到a数组中,然后在a,b中选小的逐个放入a中。复杂一点,除了省点内存外意义不大,可能效率还降低。以下代码在vs2005下编译运行。#i
2010-02-26 18:19:00
345
原创 最少交换次数
将一个无序序列变成有序(序列中没有相等的数),可以进行任意两个位置的交换操作,求最少的交换次数如:5 2 1 4 3转成:0 1 4 5 9循环分解:(9 0 4)(1)(5),只需将(9 0 4)分解即可。而(1 2 ... n)=(1 2 ... n-1)(1 n)=(1 2)(1 3)...(1 n)因此(9 0 4)可以分解为两个置换。所以该序列只需经过两次交换即可。按照这种做法,对于
2010-02-26 16:25:00
895
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人