1. 利用回溯算法求解八皇后问题
2. 利用回溯算法求解 0-1 背包问题
3. 利用分治算法求一组数据的逆序对个数
5. 最小路径和(详细可看 Minimum Path Sum)
6. 编程实现莱文斯坦最短编辑距离
7. 编程实现查找两个字符串的最长公共子序列
8. 编程实现一个数据序列的最长递增子序列
实践:
1、利用回溯算法求解八皇后问题
首先,我们要想到某种方法来解决冲突检测问题,即不能令棋子处于能相互吃掉的位置——相邻、左右对角线。
其次,运用回溯的方法,求得问题的解。此处具体为函数的递归调用,当调用到棋盘的最后一行,便跳出,求得解。
2、利用回溯算法求解 0-1 背包问题
3、利用分治算法求一组数据的逆序对个数
通过把一个数组不断的分成左右两个数组,即左序列和右序列,然后对每个部分求解逆序对,有3种情况:
(1)左序列的逆序对数量
(2)右序列的逆序对数量
(3)分离逆序对数量,即左序列有元素大于右序列中的元素
通过对一个数组不断的进行分解,直到分解成左右序列都是只包含一种元素的序列,此时左右序列的逆序对数量均为0,问题变成了第三种情况,即求解分离逆序对。
在分治算法对数组进行排序时,在合并的时候分别从左到右依次比较左序列和右序列中的元素,把最小的元素拿出来,当右边序列的元素B较小时,此时左边序列元素剩余量就是逆序对的数量,然后依次计算出当右序列元素较小时,左序列剩余元素的和就是总的逆序对数量。
4、编程实现莱文斯坦最短编辑距离
5、编程实现查找两个字符串的最长公共子序列
最长公共子串
最长公共子序列
子串要求字符必须是连续的,但是子序列就不是这样。
最长公共子序列是一个十分实用的问题,它可以描述两段文字之间的“相似度”,即它们的雷同程度,从而能够用来辨别抄袭。对一段文字进行修改之后,计算改动前后文字的最长公共子序列,将除此子序列外的部分提取出来,这种方法判断修改的部分,往往十分准确。
解法就是用动态回归的思想,一个矩阵记录两个字符串中匹配情况,若是匹配则为左上方的值加1,否则为左方和上方的最大值。一个矩阵记录转移方向,然后根据转移方向,回溯找到最长子序列。
6、编程实现一个数据序列的最长递增子序列