- 博客(7)
- 收藏
- 关注
原创 回溯法N皇后问题(以8为例)
N皇后问题:有一个N*N的棋盘,要在棋盘上放N个皇后,要求这N个皇后的位置不能同行同列同对角线。 解决:放入第i个皇后时,应该与前面i-1个皇后都不冲突,即都不同行同列同对角线,满足则放下不满足则换位置,若第i行所有位置都不满足则回溯到第i-1个皇后,让第i-1个皇后换位置直至满足要求。 注意:回溯的话就必定要做标记,可以建立一个N*N的二维数组,初始化为0,0代表没尝试过,2代表冲突,1代表
2017-06-11 20:21:24
363
原创 动态规划解决0-1背包问题
动态规划:求解一个问题的最优解,如果这个问题可以不断地分解成子问题并且这个问题的最优解包含子问题的最优解那么久可以用动态规划来解决。把所有子问题的最优解储存下来。 0-1背包:设背包容量大小C,放进去第i件物品,其重量为w,价值v。如果w>C,那么此时最优解为不放进物品i是的最优解,反之,此时最优解为不放进物品i的最优解或者是放入物品i。放入物品i时此时最优解为不放入物品i且背包容量大小为C-w
2017-06-11 20:08:02
393
原创 DFS一个图并求出它的连通分支个数
深度优先算法:选择一个点依次DFS它所连接的点,并且每个点会有一个visited标记表示是否被遍历。 连通图:如果一个图中任意两点都存在路径连接,那么这个图称为连通图 连通分支大小:遍历这个图里的所有点,有多少次重新选取一个点从它开始DFS这个图就有多少个连通分支 代码: #include #include #include using namespace std; void vis
2017-06-11 20:02:50
4771
转载 最近点对
和归并是一样的思想,但是要注意比较合并的时候要比较界限附近的最近点对,两边最近点对距离大小为d1的话,那么就以分界线为中线,遍历左边距中线0到的/2的点,寻找和它水平距离及竖直距离小于等于d1的右边的点,并比较他们之间距离和d1的大小 代码:#include #include #include #include using namespace std; const int M=50; //用
2017-06-11 19:56:56
303
原创 二分检索及三分检索
分段查找。 代码实现(数组是降序排列): void binary_searching(int *num, int number, int start, int end) { if(number>=num[end] && number<=num[start]) { int mid = (start + end)/2; int i;
2017-06-11 19:55:14
593
1
原创 归并排序
归并排序思想:首先把要排序的数组分为两部分,然后对这两部分数组分别进行归并排序(直至分到只剩一个数),最后将这两个数组合并。注意合并的时候是将这两个数组里的数移动到一个新的数组里面,当然是由小到大。 代码实现: void mergeSort(int *num, int f, int e, int *p) { if(f==e) { return; }
2017-06-11 19:52:40
183
原创 快速排序
快排思想:首先选择一个数key,然后将这个数组分为两部分,一边比key大一边不比key大,然后再将这两部分接着分,直至这个部分只有一个数 代码:void quicksort(int *num, int left, int right) { if(left>=right) { return; } int key = num[left];
2017-06-11 19:46:11
181
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅