题目:
某种字符串处理语言允许程序员将一个字符串拆分为两段。由于此操作需要复制字符串,因此要花费n个时间单位来将一个n个字符的字符串拆为两段。假定一个程序员希望将一个字符串拆分为多段,拆分的顺序会影响所花费的总时间。例如,假定这个程序员希望将一个20个字符的字符串在第2个,第8个以及第10个字符后进行拆分(字符由左至右,从1开始升序编号)。如果她按由左到右顺序进行拆分,则第一次拆分花费20个时间单位,第二次拆掉分花费18个时间单位(在第8个字符处拆分3-20间的字符串)而第三次拆分花费12个时间单位,共花费50个时间单位。但如果她按由右至左的顺序进行查分,第一次拆分花费12个时间单位,第二次拆分花费10个时间单位,而第三次拆分花费8个时间单位,共花费38个时间单位。还可以按其他顺序,比如,她可以首先在第8个字符处进行拆分(时间20),接着在左边一段第2个字符处进行拆分(时间8),最后在右边一段第10个字符处进行拆分(时间12),总时间为40.
设计算法,对给定的拆分位置,确定最小代价的拆分顺序,更形式化地,给定一个n个字符的字符串S和一个保存m个拆分点的数组Lm,计算拆分的最小代价,以及最优拆分序列。
分析:
设由Lm将S拆分成m+1个字符串,且每个字符串的长度按顺序排列与tm+1中,令p=m+1。
设Mi,j(0≤i代表拆分后的子串i到子串j合并成的串在由Lm拆分时所需的最少时间单位(易知Mi,i=0,i∈{0,1,...,p−1})。
所以,
Mi,j=min{∑k=ijtk+Mi,q+Mq+1,j},q∈{i,i+1,..,j−1}
自顶向下:
自底向上: