经常会遇到复杂问题不能简单地分解成几个子问题综述
发布时间:2023-03-25 07:16:12 来源:文档文库
小
中
大
字号:
经常会遇到复杂问题不能简单地分解成几个子问题,而会分解出一系列的子问题。简单地采用把大问题分解成子问题,并综合子问题的解导出大问题的解的方法,问题求解耗时会按问题规模呈幂级数增加。为了节约重复求相同子问题的时间,引入一个数组,不管它们是否对最终解有用,把所有子问题的解存于该数组中,这就是动态规划法所采用的基本方法。以下先用实例说明动态规划方法的使用。
【问题】求两字符序列的最长公共字符子序列问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字
符(可能一个也不去掉)后所形成的字符序列。令给定的字符序列
x=“x0,x1,…,xm-1”,序列Y“yO,y1,…,yk-1”是X的子序列,存在X的一个严格递增下标序列,i1,…,ik-1>,使得对所有的j=0,1,…,k-1,有xij=yj。例如,X=“ABCBDAB”,Y=“BCDB”是X的一个子序列。
给定两个序列A和B,称序列Z是A和B的公共子序列,是指Z同是A和B的子序列。问题要求已知两序列
A和B的最长公共子序列。
如采用列举A的所有子序列,并一一检查其是否又是B的子序列,并随时记录所发现的子序列,最终求出最长公共子序列。这种方法因耗时太多而不可取。考虑最长公共子序列问题如何分解成子问题,设质:(1)“aOa1
A=“aO,al,…,am-1”,
B=“bO,bl,…,bm-1”,并Z=“zO,z1,…,zk-1”为它们的最长公共子序列。不难证
明有以下性如果
am-1=bn-1…am-2”和“bOb1…
如果am-1!=bn-1…am-2”和“bOb1…
如果
am-1!=bn-1则
zk-1=am-1=bn-1则若
zk-1!=am-1且“zOz1
…zk-2”是
bn-2”的一个最长公共子序列;
(2)“aa1
蕴涵“zOz1
…
zk-1”是
Obn-1”的一个最长公共子序列;
(
3)a“O则若
zk-1!=bn-1蕴涵“zOz1
…
zk-1”…am-1”和“bOb1…bn-2”的一个最长公共子序列。
这样在找A和B的公共子序列时如有am-1=bn-1则进一步解决一个子问题找
a1a1O1!=bn-1是
“a
…am-2”和“bOb1…则要解决两个子问题找出
bm-2”的一个最长公共子序列;如果
am-“aOa1…am-2”和“bOb1…bn-1”的
一个最长公共子序列和找出“aQa1,…,am-1”和“bQb1,…,bn-2”的一个最长公共
子序列再取两者中较长者作为A和B的最长公共子序列。
定义c[i][j]为序列“aO,a1,…,ai-2”和“bO,b1,…,bj-1”的最长公共子序列的长度,计算c[i][j]可递归地表述如下:(1)c[i][j]=O(2)
c[i][j]=c[i-1][j-1]+1如果i=O或j=O;
如果