动态规划--字符串拆分

来源:互联网 发布:java定时任务管理系统 编辑:程序博客网 时间:2024/06/05 22:34

题目:

某种字符串处理语言允许程序员将一个字符串拆分为两段。由于此操作需要复制字符串,因此要花费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,计算拆分的最小代价,以及最优拆分序列。

分析:

设由LmS拆分成m+1个字符串,且每个字符串的长度按顺序排列与tm+1中,令p=m+1
Mi,j(0i<j<p)代表拆分后的子串i到子串j合并成的串在由Lm拆分时所需的最少时间单位(易知Mi,i=0,i{0,1,...,p1})

所以,

Mi,j=min{k=ijtk+Mi,q+Mq+1,j}, q{i,i+1,..,j1}

自顶向下:

自底向上:

原创粉丝点击